<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali sharifi</title>
        <link>https://virgool.io/feed/@a.sharifi1379</link>
        <description>بسم الله الرحمن الرحیم
علی شریفی هستم؛ دانشجوی مهندسی کامپیوتر دانشگاه صنعتی شریف!</description>
        <language>fa</language>
        <pubDate>2026-06-16 09:36:10</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/860013/avatar/F9MxY1.jpg?height=120&amp;width=120</url>
            <title>Ali sharifi</title>
            <link>https://virgool.io/@a.sharifi1379</link>
        </image>

                    <item>
                <title>فواید مشخص‌کردن صریح Schemaی داده در PySpark</title>
                <link>https://virgool.io/@a.sharifi1379/%D9%81%D9%88%D8%A7%DB%8C%D8%AF-%D9%85%D8%B4%D8%AE%D8%B5-%DA%A9%D8%B1%D8%AF%D9%86-%D8%B5%D8%B1%DB%8C%D8%AD-schema%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-pyspark-kpx00we8axol</link>
                <description>امروزه یکی از ابزارهایی که برای تحلیل داده‌های بزرگ در صنعت استفاده میشه، Spark هست. Spark یک موتور پردازش داده است که bindingهایی به چند زبان، از جمله پایتون، جاوا، و اسکالا داره. همچنین در دنیای امروزه با توجه به توسعه ابزارهای تحلیل داده در زبان پایتون، انقیاد Spark به پایتون، یعنی PySpark به صورت گسترده‌ای استفاده میشه. در این نوشته قصد دارم توصیه‌ای درباره استفاده از PySpark بهتون بکنم که شما رو از ارتکاب اشتباه‌های رایج دور کنه و همچنین طول عمر کدهاتون رو افزایش بده.اسکیمای داده‌تون رو صراحتا مشخص کنید!برخی از فرمت‌های ذخیره‌سازی داده، ماننده parquet fileها، اطلاعات هر ستون از داده مثل نوعش یا توضیحی که درباره اون وجود داره رو ذخیره می‌کنن. برخی از فرمت‌ها هم مانند CSV فاقد چنین اطلاعاتی هستن. وقتی که با استفاده از PySpark داده‌های چنین فایل‌هایی رو می‌خونید، اگر که اطلاعات مرتبط با نوع داده هر ستون موجود باشه، PySpark این نوع رو به عنوان نوع ستون خونده‌شده در قرار میده، در غیر اینصورت خودش از روی داده‌ها یک نوع رو استنتاج می‌کنه. در اغلب مواقع، PySpark کارش رو به خوبی انجام میده و انواع استنتاج شده با داده سازگارن، ولی گاهی پیش میاد که PySpark نمی‌تونه چنین کاری رو انجام بده و نوع‌ها رو به صورت اشتباه استنتاج می‌کنه. به عنوان مثال داده‌ای به شکل 15:00:00 27-12-2024 رو به شکل String ذخیره می‌کنه که این ممکنه در ادامه براتون مشکل‌ساز باشه.یک روش که به شما کمک میکنه که از افتادن در دام این چنین اشتباه‌هایی پرهیز کنید، اینه که اسکیمای داده‌تون رو صراحتا مشخص کنید. با استفاده از پیمانه pyspark.sql.types می‌تونید این کار رو انجام بدید. برای هر ستون از داده‌تون، می‌تونید نام، نوع، و nullable بودن اون رو مشخص کنید. این کار به شما کمک می‌کنه که نوع داده ستون‌ها رو به درستی مشخص کنید، و همچنین اگر که در ستونی از داده، مقدار nullای وجود داشته باش، با خطایی که PySpark بر می‌گرداند از آن مطلع شوید.از مزایای دیگر مشخص‌کردن صریح اسکیما اینه که کدتون رو از تغییرات نسخه داده مصون نگه میداره. در صنعت بسته به نیازمندی‌های همواره در حال تغییر، پیش میاد که اسکیمای ذخیره‌سازی داده‌ها تغییر کنن. اگر که کد شما وابسته به اسکیمای داده خام باشه، هر بار که نسخه جدید از داده منتشر بشه، باید همه کد رو تغییر بدید و اون رو با داده جدید سازگار کنید. در صورتی که شما اسکیمای داده رو صراحتا مشخص کنید، و کدتون رو با استفاده از اسکیمای تعریف شده بنویسید، در صورت انتشار یک نسخه جدید از داده، تنها قسمتی از کد که تغییر می‌کند، بخش خوندن داده خام و به شکل اسکیمای تعریف‌شده در آوردنشه. جمع‌بندیاگر که کدی که می‌نویسید، مهمون حداکثر یکی-دو روزه، می‌تونید به هر شکلی که خواستید بنویسیدش. ولی اگر که کد قراره که مدت زمان زیادی زنده بمونه و به دفعات در طول زمان نسبتا طولانی اجرا بشه، خیلی مهمه که بتونه خودش رو تا حدودی از معرض تغییر قرار گرفتن حفظ کنه. تعیین اسکیمای داده به صورت صریح هم یکی از روش‌هاییه که می‌تونه به زنده‌موندن کدتون کمک کنه! علاوه بر این، بهتون کمک می‌کنه که مطمئن بشید که داده‌هایی که در هر ستون ذخیره شدن، چه از لحاظ نوع و چه از لحاظ  null بودن با ذهنیت شما سازگارن.</description>
                <category>Ali sharifi</category>
                <author>Ali sharifi</author>
                <pubDate>Fri, 27 Dec 2024 15:34:06 +0330</pubDate>
            </item>
                    <item>
                <title>چطوری کدمو سریع‌تر کنم؟!</title>
                <link>https://virgool.io/@a.sharifi1379/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%DA%A9%D8%AF%D9%85%D9%88%D9%86%D9%88-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%AA%D8%B1-%DA%A9%D9%86%DB%8C%D9%85-illis1vjox5p</link>
                <description>اگر قرار باشه یک کد کاربرهای زیادی داشته باشه و موارد استفاده‌ش زیاد باشه، لازمه که بتونه به سرعت اجرا شه. اگر که شما هم کد پایتونی دارید که نیازمندی‌های شما رو از لحاظ زمان اجرا برطرف نمی‌کنه و می‌خواید که عملکردش رو بهبود بدید، این نوشته می‌تونه به شما کمک کنه.از کجا شروع کنم؟!برای شروع باید متوجه بشید که کدوم قسمت کد بخش عمده زمان اجرای شما رو می‌گیره. در زبان پایتون، ابزارهایی برای profile کردن کدها توسعه‌داده‌شده. یکی از این ابزارها، line profiler هست که اطلاعات خوبی درباره زمان اجرای هر قسمت از کدتون بهتون میده. نحوه کارکرد این کتابخونه به این شکل هست که توابعی که میخواید عملکردشون رو بسنجید رو با profile@ باید annotate کنید و در زمان اجرا متغیر محلی LINE_PROFILE رو با مقدار ۱ تنظیم کنید و کدتون رو اجرا کنید. خروجی این اجرا به صورت یک فایل خواهد بود که توی اون درباره خط به خط توابع مشخص شده، تعداد دفعاتی که اون خط اجرا شده، کل زمانی که اجرا شده، میانگین زمان هر بار اجرا، و درصد زمانی که اون خط به خودش تخصیص‌داده رو نشون میده و به شما کمک می‌کنه که گلوگاه کد رو پیدا کنید.حالا که پیداش کردیم، چیکارش کنم؟!راه‌های مختلفی برای بهبود عملکرد یک کد وجود داره. یک راه اینه که به دنبال الگوریتم‌های بهینه‌تری برای حل مساله‌تون بگردید. الگوریتم‌ها بزرگترین نقش رو در عملکرد یک سیستم دارن. اگر نقطه بهبودی در الگوریتم پیدا نکردید، می‌تونید به استفاده از داده‌ساختارهای دیگه فکر کنید. به عنوان مثال، اگر که به صورت مستمر عضویت یک شی رو در یک collection چک می‌کنید، استفاده از set بهینه‌تر از استفاده از list هست. یک راه دیگه‌ای که می‌تونه خیلی بهتون کمک کنه، array programming هست. خوبه که بدونید که اشیا پایتون، حتی primitive typeها به شکل غیر بهینه‌ای ذخیره می‌شن و پایتون برای هر کدومشون در سطح پایین یک struct نگهداری می‌کنه که شامل نوع، مقدار، و سایر اطلاعات اونا میشه. اگر که شما در کدتون، دوتا عدد طبیعی رو با هم جمع کنید، پایتون اول چک می‌کنه که نوع این دو شی، عدد باشه و جمع بینشون تعریف شده باشه و بعد جمع رو انجام میده و نتیجه رو بر میگردونه. همه این اتفاقات در زبان‌هایی که type checking دارن میتونن انجام نشن و سرعت خیلی بیشتری داشته باشید. جالبه که بدونید بعضی از کتابخونه‌هایی که در محاسبات استفاده میشن، مثل Numpy و Pandas و ...، به زبان C نوشته شدن و سرعت انجام محاسبات در اون ها بسیار بالاس. این کتابخونه‌ها می‌تونن عملیات‌های برداری رو به خوبی و با عملکرد بالا پشتیبانی کنن. بنابرین توصیه می‌کنم در صورتی که منطق ساده مبتنی بر محاسبات زیاد دارید این کتابخونه‌ها رو فراموش نکنید.راه‌حل‌های مختلف رو چطوری مقایسه کنم؟اگر که بخواید راهکارهای مختلفی رو برای بهبود بخشی از کد مقایسه کنید، می‌تونید از ابزار timeit در پایتون استفاده کنید. این ابزار یک تکه کد رو به تعدادی بار (که شما توانایی تنظیم آن را دارید) اجرا می‌کند و میانگین زمان اجرا و انحراف معیار را به شما میده و شما رو قادر می‌کنه که بتونید عملکرد راهکارهای مختلف رو مقایسه کنید.جمع‌بندیبرای بهبود عملکرد کد خیلی مهمه که به صورت کور عمل نکنید و حواستون رو متوجه قسمت درست کنید. همه موارد فوق به شما کمک می‌کنن که بتونید کد سریع‌تری داشته باشید. واضحه که این موارد، جامع نیستن و بسته به کاربرد و شرایط می‌تونید از راهکارهای دیگه‌ای استفاده کنید. برای اطلاعات بیشتر از این ابزارها و راهکارها، می‌تونید به مستنداتشون که در زیر اومده مراجعه کنید.https://github.com/pyutils/line_profilerhttps://docs.python.org/3/library/timeit.htmlhttps://pandas.pydata.org/https://numpy.org/</description>
                <category>Ali sharifi</category>
                <author>Ali sharifi</author>
                <pubDate>Thu, 26 Dec 2024 21:30:23 +0330</pubDate>
            </item>
                    <item>
                <title>کاشی‌کاری کره زمین با شش‌ضلعی‌ها!</title>
                <link>https://virgool.io/@a.sharifi1379/%DA%A9%D8%A7%D8%B4%DB%8C-%DA%A9%D8%A7%D8%B1%DB%8C-%DA%A9%D8%B1%D9%87-%D8%B2%D9%85%DB%8C%D9%86-%D8%A8%D8%A7-%D8%B4%D8%B4-%D8%B6%D9%84%D8%B9%DB%8C-%D9%87%D8%A7-fzjdktuppetv</link>
                <description>در مقاله قصد دارم که یکی از تکنولوژی‌های توسعه داده‌شده توسط Uber را معرفی کنم؛ سیستم شاخص‌بندی سلسله‌مراتبی موقعیت‌های جغرافیایی h3.شاید تا کنون برایتان پیش‌آمده‌باشد که برای رفتن به جایی عجله داشته‌باشید و شاید دیرتان شده‌باشد و بخواهید به سرعت، یک تاکسی اینترنتی برای رفتن به موقعیت مدنظرتان بگیرید. یک پیشامد ناگوار نامطلوب در این حالت این است که در مجاورتتان، سفیری موجود نباشد که با درخواستتان موافقت‌کند و شما را به مقصدتان برساند. یا این که به عنوان سفیر در یک تاکسی اینترنتی، مسافرین کمی به طورتان بخورد!یکی از دغدغه‌های مهم تاکسی‌های اینترنتی، تعدیل نسبت عرضه به تقاضا است؛ طوری که از بروز چنین سناریوهایی جلوگیری‌کرده و مشتریان خود را راضی نگه‌دارند. یعنی بتوانند در هر «همسایگی‌ای» از نقشه، تعداد مسافرین و تعداد سفیران را متعادل نگه‌دارند. در این صورت، احتمال قبول‌شدن درخواست مسافرین افزایش خواهدیافت و همچنین سفیران نیز زمان کم‌تری در جستجوی مسافرین خواهندماند.حال می‌ماند این که «همسایگی» را چگونه تعریف‌کنیم. راهکار ارائه‌شده توسط Uber این است که نقشه کره زمین را به وسیله تعدادی شش‌ضلعی و پنج‌ضلعی بپوشانیم. تعداد شش‌ضلعی‌های استفاده‌شده وابسته به این است که چه میزان می‌خواهید ریزدانه‌تر باشید؛ به عبارت دیگر، هر چه وضوح (resolution) بیشتری بخواهید، باید از شش‌ضلعی‌های بیشتری استفاده‌کنید. از طرف دیگر، تعداد پنج‌ضلعی‌ها همواره ثابت‌است، در هر وضوحی، ۱۲ پنج‌ضلعی خواهیم داشت.سیستم شاخص‌بندی h3، از ۱۶ وضوح مختلف پشتیبانی می‌کند، از وضوح ۰ تا ۱۵. در وضوح ۰، یعنی درشت‌دانه‌ترین وضوح ممکن، نقشه کره زمین به وسیله ۱۲ پنج‌ضلعی و ۱۱۰ شش‌ضلعی پوشیده می‌شود. مساحت هر شش‌ضلعی در این وضوح، تقریبا ۴,۳۵۷,۴۴۹ کیلومتر مربع است. برای این که حس بهتری نسبت به این عدد داشته‌باشید، می‌توانید در نظر بگیرید که مساحت ایران تنها ۱,۶۴۸,۱۹۵ کیلومتر مربع است. به بیان دیگر، هر شش‌ضلعی در وضوح ۰، تقریبا ۲.۶ مساحت ایران است.همانطور که در تصویر فوق مشاهده می‌کنید، ایران در مرز میان دو شش‌ضلعیِ وضوح ۰قرار گرفته‌است و این دو شش‌ضلعی، علاوه بر ایران، عراق، سوریه، ارمنستان، گرجستان، آذربایجان، قسمت عمده‌ای از ترکیه، افغانستان، و پاکستان را هم پوشانده‌اند. (علاوه بر چندین دریا و خلیج و اقیانوس و کشورهایی ذکر نشده‌اند!)شش‌ضلعی‌های هر وضوح، تقریبا یک‌هفتم مساحت شش‌ضلعی‌های وضوح کمتر خود را دارند. این یعنی با افزایش وضوح، به ریزدانگی بیشتری خواهیم رسید. به عنوان مثال، شهر تهران تقریبا در یک شش‌ضلعیِ وضوح ۴ به مساحت تقریبی ۱,۸۲۹ کیلومتر مربع قرار می‌گیرد.شاید برایتان سوال باشد که چگونه تقسیم یک شش‌ضلعی، به هفت شش‌ضلعی کوچکتر ممکن‌است؟ باید بگویم که اولا این تقسیم‌بندی به شکل دقیق انجام نمی‌شود، یعنی این هفت‌ضلعی کوچک، «تقریبا» شش‌ضلعی بزرگ‌تر را افراز می‌کنند. سوال دیگری که شاید برایتان مطرح‌شود این است که پنج‌ضلعی‌ها را چگونه افراز می‌کنند؟ جواب این است که هر پنج‌ضلعی را نیز «تقریبا» می‌توان به وسیله ۱ پنج‌ضلعی و ۵ شش‌ضلعی کوچکتر پوشاند.شاید در کنار تمامی این سوال‌ها، باز هم سوالات بیشتری برایتان پیش آمده‌باشد. به طور مثال این که منظور از کاشی‌کاری زمین با شش‌ضلعی‌ها چیست؟ یا این که چرا اصلا شش‌ضلعی‌ها؟ چرا مثلث‌ها، مربع‌ها، یا هشت‌ضلعی‌ها نه؟! تمامی این سوالات، سوالات خوبی هستند ولی از هدف این مقاله که یک معرفی اجمالی این تکنولوژی بود، به دور اند. برای جزئیات بیشتر می‌توانید به این مرجع مراجعه کنید. همچنین برای امتحان کردن این شاخص‌بندی، می‌توانید از این سایت استفاده‌کنید.</description>
                <category>Ali sharifi</category>
                <author>Ali sharifi</author>
                <pubDate>Sat, 24 Aug 2024 17:29:50 +0330</pubDate>
            </item>
            </channel>
</rss>