<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های صالح منتظران</title>
        <link>https://virgool.io/feed/@salehmontazeran</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-10 14:49:03</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/13078/avatar/Eb7f31.jpg?height=120&amp;width=120</url>
            <title>صالح منتظران</title>
            <link>https://virgool.io/@salehmontazeran</link>
        </image>

                    <item>
                <title>در مصرف حافظه ولخرجی کنیم یا ریسک ایجاد باگ را بپذیریم؟</title>
                <link>https://virgool.io/Rocket/%D8%AF%D8%B1-%D9%85%D8%B5%D8%B1%D9%81-%D8%AD%D8%A7%D9%81%D8%B8%D9%87-%D9%88%D9%84%D8%AE%D8%B1%D8%AC%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-%DB%8C%D8%A7-%D8%B1%DB%8C%D8%B3%DA%A9-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%A8%D8%A7%DA%AF-%D8%B1%D8%A7-%D8%A8%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C%D9%85-o9t24i1fcygw</link>
                <description>https://medium.com/@gough.cory/performance-of-numpy-array-vs-python-list-194c8e283b65فرض کنید داده بزرگی چه در یک آرایه numpy یا در یک دیتافریم pandas دارید و قصد دارید سلسله‌ای از عملیات‌ها را روی آن‌ها انجام دهید. بصورت پیش فرض هر دو کتابخانه برای انجام عملیات‌ها از داده‌ها کپی درست می‌کنند که به معنی مصرف بیشتر حافطه است.هر دو کتابخانه توابعی برای تغییر داده‌ها بصورت درجا دارند اما استفاده از این دست توابع شاید منتهی به ایجاد باگ‌های اعصاب خردکنی بشود.پس باید چیکار کرد؟در این نوشته الگوی hidden mutability و نحوه استفاده از آن را یاد می‌گیریم که یک مصالحه بین دو مورد مطرح شده است: پیش نیامدن باگ‌های اعصاب خورد کن و کاهش مصرف حافظه تا حدودی.یک مثال: مصرف بیش از حد حافظهتابع زیر را در نظر بگیرید (تابع یک آرایه float را می‌گیرد و نسخه نرمال شده آن که دارای مقادیر بین صفر و یک است را برمی‌گرداند): https://gist.github.com/salehmontazeran/4115d7fcbc8b8192f9b0439bb948c4b3 این تابع چقدر حافظه مصرف میکند؟ اگر آرایه ورودی N بایت باشد٬ تابع از N*3 بایت حافظه استفاده می‌کند.آرایه ورودی که بدون تغییر می‌ماند (N بایت)آرایه موقتی که نتیجه array - low در آن نگه داری می‌شود (N بایت)نتیجه‌ نهایی که تابع باز می‌گرداند ‌(N بایت)خب چطوری میشه این مصرف حافظه رو کمتر کرد؟تغییر درجابرای کاهش مصرف حافظه می‌توانیم از عملگرهای درجا مثل =+ که عملیات‌ها را روی آرایه اصلی انجام دهند استفاده کنیم: https://gist.github.com/salehmontazeran/c6c55868a4b12b7d3cda9d8c1f398f58 همچنین:تعدادی از توابع numpy در ورودی یک آرگومان out می‌گیرند که به شما اجازه می‌دهد نتیجه را در یک آرایه موجود٬ که معمولا شامل خود آرایه اصلی هم می‌شود٬ بریزید.توابع pandas هم معمولا یک آرگومان inplace دارند که خود شی را بجای بازگرداند یکی شی جدید دستخوش تغییر می‌کنند.در تمام موارد بالا شما در حال تغییر خود شی یا داده اصلی هستید و همین کار باعث صرفه‌جویی در مصرف حافظه می‌شود. در مثال بالا تقریبا تابع فقط با N بایت داده سر و کار دارد در مقابل حالت قبل که سه برابر این مورد با حافظه سر و کار داشت.مشکلات ناشی از تغییر درجاتغییر درجا (mutating) می‌تواند باعث ایجاد نتایج عجیب و باگ شود. برای مثال اگر هدف شما برای استفاده از تابع normalization جهت نمایش داده‌ها باشد: https://gist.github.com/salehmontazeran/f21c582458d770fa58e3d99302176d87#file-minimizing-copying_3-py این کد دارای باگ است، چرا؟ تابع do_something انتظار دارد که داده اصلی به آن پاس داده شود و نه نسخه normalize شده آن. اگر در حال DEBUG کد باشید تابع do_something یک ورودی و اگر در حال دیباگ نباشید یک ورودی دیگر میگیرد.معمولا افرادی که از کد شما استفاده می‌کنند انتظار ندارند توابع روی خود داده بصورت مستقیم تغییری ایجاد کند، حتی بعد از مدتی ممکنه خود شما هم این نکته را فراموش کنید.خب بالاخره که چی؟ پس چی کنیم؟تغییر درجا پنهانمعمولا توابع، ورودی خودشون رو بصورت درجا تغییر نمی‌دهند اما این به این معنا نیست که تابع ما درون خودش نمی‌تواند تغییر درجایی داشته باشد که پنهان از فراخوانی کننده بیرون تابع باشد.اگر قرار باشد کد ما این الگو را رعایت کند باید بصورت زیر نوشته شود. https://gist.github.com/salehmontazeran/40f8e4454ec6e66ce47fccb8b43994ee از دیدگاه فراخوانی کننده، این تابع همانند تابع اصلی اولیه است: ورودی تابع هیچوقت دستخوش تغییر نمی‌شود اما ما با حذف آن قسمتی از کد که منتج به ایجاد یک آرایه موقتی می‌شد (که بلافاصله هم دور ریخته می‌شد)، مصرف حافظه را از N*3 به N*2 کاهش دادیم.Reference: https://pythonspeed.com/articles/minimizing-copying/</description>
                <category>صالح منتظران</category>
                <author>صالح منتظران</author>
                <pubDate>Thu, 28 Apr 2022 10:49:39 +0430</pubDate>
            </item>
                    <item>
                <title>صریح باشید!</title>
                <link>https://virgool.io/@salehmontazeran/%D8%B5%D8%B1%DB%8C%D8%AD-%D8%A8%D8%A7%D8%B4%DB%8C%D8%AF-tqrnh2iv0rjp</link>
                <description>https://tampabaymoms.com/ages-stages/babies/behavior-bites-series-1-be-explicit-with-your-children/فرض کنید یک لیست 100 میلیون عنصری که تمامشان از جنس float هستند داریم، می‌خواهیم این لیست را به یک آرایه numpy تبدیل کنیم. راه مرسوم این کار استفاده از تابع array یا توابع دیگری که روی این تابع سوار شده‌اند است:از ورژن‌های اخیر numpy، نوع پیش‌فرض برای ساخت آرایه دارای اعداد اعشاری، np.float64 است، در نتیجه dtype آرایه نهایی np.float64 می‌شود.حالا ممکنه بپرسید مشکل کار کجاست؟کارکرد numpy به این صورت است که بعد از خواندن اولین عنصر لیست متوجه می‌شود باید نوع آرایه خروجی np.float64 باشد پس از عنصر دوم به بعد سعی می‌کند تمام عناصر را به np.float64 تبدیل کند. همه چی به نظر خوب میاد به‌جز اینکه به یه مرحله اشاره نکردیم. قبل از اینکه numpy کار تبدیل را انجام دهد ابتدا چک می‌کند که می‌تواند عنصر جدید را np.float64 تبدیل کند یا نه، که همین یک سربار اضافی را به ما تحمیل می‌کند، ما از نوع عناصر لیست مطمئن هستیم پس نیاز نیست numpy این کار را انجام دهد.برای حذف مرحله اضافی ذکر شده کافیه هنگام تبدیل dtype مد نظرمون رو بصورت صریح بگیم. اینجوری دیگه numpy اون مرحله چک اضافه رو انجام نمی‌ده و فقط سعی می‌کنه اعداد رو به np.float64 تبدیل کنه و اگر نتونست این کار رو بکنه اون موقع یک exception پرتاب می‌کنه.روی ماشین شخصی من که پردازنده i7-6700K داره کد دوم بصورت میانگین حداقل یک ثانیه زودتر اجرا می‌شه روی ماشین ضعیف‌تر به ده ثانیه هم می‌رسه. اما بصورت کلی در ابعاد و سایز بزرگ‌تر حتی ماشین‌های قوی‌تر رو هم اذیت می‌کنه.اگر از نظر شما چیزی اشتباه یا ناقص است لطفا در نظرات بفرمایید.Reference: https://github.com/numpy/numpy/issues/21259</description>
                <category>صالح منتظران</category>
                <author>صالح منتظران</author>
                <pubDate>Wed, 30 Mar 2022 10:28:20 +0430</pubDate>
            </item>
            </channel>
</rss>