পাইথনে স্টার পারফরম্যান্স


88

পাইথন কোড এক টুকরা প্রোফাইলিং যদিও ( python 2.6আপ 3.2), আমি আবিষ্কার করেছি যে strপদ্ধতি একটি বস্তু রূপান্তর করার জন্য একটি স্ট্রিং (আমার ক্ষেত্রে একটি পূর্ণসংখ্যা মধ্যে) বিন্যাস স্ট্রিং ব্যবহার করে তুলনায় ধীর মাত্রার প্রায় একটি আদেশ হয়।

এই হল মানদণ্ড

>>> from timeit import Timer
>>> Timer('str(100000)').timeit()
0.3145311339386332
>>> Timer('"%s"%100000').timeit()
0.03803517023435887

কেউ কি জানেন কেন এই ঘটনা? আমি কিছু অনুপস্থিত করছি?


4
এবং কী'{}'.format(100000)
উইম

এটি সবচেয়ে ধীরে ধীরে তবে সবচেয়ে নমনীয়ও।
লুকা এসবার্ডেলা

উত্তর:


106

'%s' % 100000 সংকলক দ্বারা মূল্যায়ন করা হয় এবং রান-টাইমে স্থির সমান equivalent

>>> import dis
>>> dis.dis(lambda: str(100000))
  8           0 LOAD_GLOBAL              0 (str)
              3 LOAD_CONST               1 (100000)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda: '%s' % 100000)
  9           0 LOAD_CONST               3 ('100000')
              3 RETURN_VALUE        

%একটি রান-টাইম এক্সপ্রেশন সহ (উল্লেখযোগ্যভাবে) দ্রুত নয় str:

>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664

strডিয়েট্রিচইপ বলেছেন যে এটি এখনও কিছুটা ধীর গতিযুক্ত নোট করুন , কারণ এটি দেখার জন্য strএবং ফাংশন কল অপারেশনগুলির সাথে জড়িত রয়েছে, যখন %একটি তাত্ক্ষণিক বাইটকোড সংকলন করা হয়েছে:

>>> dis.dis(lambda x: str(x))
  9           0 LOAD_GLOBAL              0 (str)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda x: '%s' % x)
 10           0 LOAD_CONST               1 ('%s')
              3 LOAD_FAST                0 (x)
              6 BINARY_MODULO       
              7 RETURN_VALUE        

অবশ্যই উপরেরটি আমি যে সিস্টেমে পরীক্ষিত হয়েছিল তার জন্য সত্য (সিপিথন ২.7); অন্যান্য বাস্তবায়ন পৃথক হতে পারে।


প্রকৃতপক্ষে এটি কারণটির মতো দেখায়, আমি কেবল নিজের চেষ্টা করেছি এবং স্ট্রিং ফর্ম্যাটিং তুলনায় প্রায় 5% দ্রুত str। উত্তরের জন্য ধন্যবাদ.
কোথাও

4
আরও বিশদভাবে strজানাতে : এমন একটি নাম যা স্ট্রিং টাইপ ব্যতীত অন্য কোনও ক্ষেত্রে প্রত্যাবর্তন করতে পারে তবে স্ট্রিং ফর্ম্যাটিং - অর্থাৎ str.__mod__পদ্ধতি - প্রতিস্থাপন করা যায় না, যা সংকলককে অপ্টিমাইজেশন করার অনুমতি দেয়। সংকলকটি অপ্টিমাইজেশনের পথে খুব বেশি কিছু করে না, তবে এটি আপনি যা ভাবেন তার চেয়ে বেশি করেন :)
কার্ল নচটেল

4
... এবং এখানে শিখার পাঠটি হ'ল: এই জাতীয় পরীক্ষায় কখনও আক্ষরিক ব্যবহার করবেন না!
আঙ্কেলজিভ

এই নির্দিষ্ট ব্লগ এন্ট্রি আপনার আগ্রহী হতে পারে: skymind.com/indocrow/python_string । এটিতে আপনি উপরে যেভাবে সরবরাহ করেছেন তার অনুরূপ বিভিন্ন স্ট্রিং কনক্যাটেনশন পদ্ধতির মানদণ্ডগুলির একটি চার্ট রয়েছে।
অ্যারন নিউটন

14

মাথায় আসার একটি কারণ হ'ল সত্য যেটি str(100000)বিশ্বব্যাপী অনুসন্ধানের সাথে জড়িত, কিন্তু "%s"%100000তা নয়। strবিশ্বব্যাপী বিশ্বব্যাপী সুযোগ তাকিয়ে করতে হবে। এটি পুরো পার্থক্যের জন্য অ্যাকাউন্ট করে না:

>>> Timer('str(100000)').timeit()
0.2941889762878418
>>> Timer('x(100000)', 'x=str').timeit()
0.24904918670654297

Thg435 দ্বারা উল্লিখিত ,

>>> Timer('"%s"%100000',).timeit()
0.034214019775390625
>>> Timer('"%s"%x','x=100000').timeit()
0.2940788269042969
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.