وبلاگ تخصصی جامعه برنامه‌نویسی مدرن آی او استریم

آخرین پست‌های مرتبط با فناوری و برنامه نویسی مدرن در این بخش در اختیار شما قرار می‌گیرد.



مقایسه نتیجه پردازش متن بین زبان Python و ++C


نویسنده: کامبیز اسدزاده
تاریخ انتشار : 1396/8/26 14:28 /   /  موضوعات : زبان‌های برنامه نویسی دفعات بازدید : 556  

زمانی که در رابطه با پردازش متن صحبت می‌شود٬ کدامیک بهتر هستند؟ سی پلاس پلاس یا پایتون؟ پاسخ ممکن است شما را شگفت زده کند!

متن همیشه قالب (فرمت) اصلی برای داده به شمار می‌آید و هرگز به خوبی سازماندهی نخواهد شد. با توجه به شوخی معروف فیل کارتون٬ دو مشکل سخت در محاسبات عبارتند از نامگذاری چیزها٬ عدم تایید کش و خطاهای غیر مستقیم. و البته یک مشکل سوم هم می‌تواند به عنوان (قالب بندی چیزها) مطرح باشد. اکثر داده های متنی دارای ناهماهنگی در قالب بندی هستند که موجب سخت شدن در پردازش می‌شود و بیشتری زمان در پردازش متن برای حل مشکلات قالب بندی صرف می‌شود. اینها یک سری واقعیتهای غم انگیز در رابطه با پردازش متن هستند.

کتابخانه‌های مناسب و معقولی برای رسیدگی به بسیاری از مسائل متن وجود دارند. اما یک چیز در این میان بارها مطرح می شود٬ آن چیزی نیست به جز دستیابی به نیمه-قالب بندی شده٬ نوعی از متن جدولی مانند فایل‌های log است. فایل‌های log خاصیت اغفال کننده‌ای دارند زیرا آنها با ظاهر و وعده های منظم عرضه می‌شوند. برای مثال٬ وبلاگها همان چیزهایی هستند که در فرمت‌های دقیق و تعریف شده‌ای سرور آنها را منتشر می‌کند. البته کتابخانه‌های خوبی برای این کار در پایتون وجود دارد. اما متاسفانه آنها بسیار آهسته هستند. مخصوصا زمانی که برای تجزیه و تحلیل عبارت‌ها و منظم سازی آن‌ها از منابع سخت افزاری استفاده می‌شود این کار بار‌ها و بار‌ها تکرار خواهد شد و از طرفی سرعت برای نتیجه گیری بسیار مهم است.

اخیرا با مشکلی در رابطه با این مورد مواجه شده ایم٬ و با استفاده از ریجکس از آن را حل کرده ایم که حدود ۳ ساعت به طول انجامید اما هنوز هم نیاز به سرعت بالا بسیار مهم بود است ما نیاز داشتیم تا یک سری اطلاعات کاملا مشخص را از خطوط طولانی log بیرون بکشیم٬ و بر روی یک ریجکس که کار را به سادگی در پایتون انجام می‌دهد پیاده سازی کنیم که به صورت کد زیر خواهد بود :

 lineParser = re.compile('([(\d\.)]+) - - \[(.*?)\] "(.*?)" (\d+) (-|\d+) "(.*?)" "(.*?)"')
 

اینکه ریجکس واقعا یک تجزیه کننده نیست در آن شکی نداریم. اما با استفاده از pylogparser توانستیم سرعت آن را تا حد بسیار چشم گیری افزایش دهیم. چرا که این کتابخانه واقعا برای تجزیه تحلیل‌های پیچیده و دشوار طراحی شده است اما با این حال هنوز هم حدود ۱ ساعت زمان برای این کار نیاز بود. با این حال آیا ++C می‌تواند در تجزیه این مورد سریعتر از چیزی باشد که به دست آورده ایم؟ همه می‌دانیم که در سرعت سی++ شکی نیست اما این را در نظر بگیرید که تجزیه تحلیل متن (پردازش در متن) به عوامل بسیار زیادی بستگی دارد.

نوشتن کد توسط سی پلاس پلاس کمی طولانی تر از پایتون خواهد بود. البته این برای نوشتن یک کد با کیفیت بالا نیازمند مهارت بسیار بالایی در سی++ خواهیم داشت. در این میان کد پایتون خود را که در آزمایش ۱۱۷ خط بود به ۱۴۳ خط در سی پلاس پلاس تبدیل کردیم! این امر با استفاده از ریجکس در کتابخانه بوست (Boost) صورت گرفت که بیشتر با منطق اسکریپت پا برجاست.

ریجکس نوشته شده در پایتون توسط کتابخانه بوست به راحتی توسط boost::regex به صورت زیر تبدیل شد:

 boost::regex lineParser{"([(\\d\\.)]+) - - \\[(.*?)\\] \"(.*?)\" (\\d+) (-|\\d+) \"(.*?)\" \"(.*?)\""};
 

پس از نوشتن کد سازنده در سی پلاس پلاس٬ پیگیری بک-اسلش ها خیلی سخت نبود. چند ساعتی برای نوشتن کد زمان نیاز بود اما این در زمان اجرا بسیار ارزشمند بود!!! زمانی که برای اولین بار کد را اجرا کردیم که در پایتون در ۳ ساعت به طور انجامید اینبار تحت سی++ به نتیجه ای سه برابر سریعتر دست یافتیم!!! اما تقویت کننده Boost نشان می‌دهد که یک جایگزین برای boost::regex وجود دارد که معیارهایی بسیار سریعتر را دارد مانند :  boost::xpressive::regex که به صورت زیر خواهد بود‌:

 boost::xpressive::sregex lineParser = boost::xpressive::sregex::compile("([(\\d\\.)]+) - - \\[(.*?)\ \] \"(.*?)\" (\\d+) (-|\\d+) \"(.*?)\" \"(.*?)\"");
 

همان کد ریجکس با روش جدیدتر کامپایل شده است و آزمایش دوم پایتون که ۱ ساعت زمان برد را در سی++ تحت روش دوم بوست بررسی کردیم و نتیجه فقط ۱۰٪ سریعتر از نسخه پایتون بود!

 

نکات مهم در رابطه با پردازش متن که هرچند ++C سریعتر است اما اگر دقت کنید در روش عادی ۳ برابر سریعتر و در روش شتاب دهی تنها ۱۰٪ تفاوت کرد در حالی که بر اساس تعاریف باید روش دوم آن تا ۴ یا ۵ برابر سریعتر اجرا می‌شد و این بدین معنی است که ریجکس را در سریعتر اجرا شدن نباید فقط به زبان متکی کرد:

  1. عملکرد ریجکس می‌تواند به شدت در بین زبانها متفاوت باشد
  2. برای هر مورد داده شده در دنیای واقعی٬ هیچ اطمینانی وجود ندارد که یک زبان به صورت ذاتی بدون هیچ تغییراتی سریعترین پردازش را انجام دهد
  3. تصور نکنید که انتقال از Python به ++C موجب می‌شود سریعترین زمان را در پردازش متن به دست آورید هرچند زبان برنامه نویسی ++C سریع است اما ممکن است کد شما با روشی نوشته شود که بازدهی آنچنان چشمگیری را نداشته باشد
  4. معیار آزمون تنها روشی است که برای بررسی کدهای مشابه با روش های متفاوت انجام می‌شود نشان می دهد چه کدی در این زمینه سریعتر اجرا خواهد شد
  5. سی ++ زبان بسیار سریعی است همچنین پایتون اما فراموش نکنید اگر در سی++ مهارت بالایی نداشته باشید کد‌های شما آنطور که باید سریع نخواهند بود بنابراین مهارت بالا برای تولید کد High-End بسیار مهم است.

 

برچسب ها: ++C, مقایسه, Python

منبع: dzone


<p>کامبیز اسدزاده٬ برنامه‌نویس و کارآفرین حوزه‌ی مهندسی کامپیوتر و فناوری‌های مرتبط با آن است. او موسس شرکت دات‌ویوز و بنیان گذار جامعه برنامه نویسی مدرن استارتاپی ایران بوده و یک توسعه دهنده فول‌اِستَک است و علاقه شدیدی به علوم فیزیک کوآنتومی و فناوری چند سکویی دارد. همچنین او معتقد است که هیچ چیز ارزشمندی آسان به دست نمی آید. تنها راه رسیدن به نتایج خوب و ماندگار، کار و تلاش مستمر است.</p>
اگر این مطلب برای شما مفید بوده آن را با دوستانتان به اشتراک بگذارید:

آخرین بازدید نظرات

تاکنون هیچ نظری از طرف کسی نوشته نشده است !

حروفي را که ميبينيد تايپ کنيد
اضافه کردن نظر