আপনি কীভাবে পাইথন স্ক্রিপ্টটি প্রোফাইল করতে পারেন?


1282

প্রকল্পের ইউলার এবং অন্যান্য কোডিং প্রতিযোগিতাগুলি প্রায়শই চালানোর সর্বোচ্চ সময় থাকে বা লোকেরা তাদের নির্দিষ্ট সমাধানটি কত দ্রুত চালায় তা নিয়ে গর্ব করে। পাইথনের সাথে, কখনও কখনও পন্থাগুলি কিছুটা ক্লডজি হয় - যার সাথে টাইমিং কোড যুক্ত হয় __main__

পাইথন প্রোগ্রামটি চালাতে কতক্ষণ সময় লাগে তার প্রোফাইল করার একটি ভাল উপায় কী?


112
প্রকল্পের ইউলার প্রোগ্রামগুলির প্রোফাইলিংয়ের দরকার নেই। হয় আপনার একটি অ্যালগরিদম রয়েছে যা এক মিনিটের মধ্যে কাজ করে, অথবা আপনার সম্পূর্ণ ভুল অ্যালগরিদম রয়েছে। "টিউনিং" খুব কমই উপযুক্ত। আপনাকে সাধারণত একটি নতুন পদ্ধতি গ্রহণ করতে হবে।
এস। লট

105
এস.লট: কোন সাব্রোটাইন ধীর গতির তা নির্ধারণ করার জন্য প্রোফাইলিং প্রায়শই সহায়ক উপায়। দীর্ঘ সময় নেয় এমন সাবরুটাইনগুলি অ্যালগরিদমিক উন্নতির জন্য দুর্দান্ত প্রার্থী।
stale ব্যাখ্যাzel

উত্তর:


1369

পাইথনে সিপ্রোফাইল নামে একটি প্রোফাইল অন্তর্ভুক্ত রয়েছে । এটি কেবলমাত্র মোট চলমান সময় দেয় না, প্রতিটি ফাংশনকে পৃথকভাবে বার করে দেয় এবং আপনাকে জানায় যে প্রতিটি ফাংশনটি কতবার ডাকা হয়েছিল, যাতে আপনার অপ্টিমাইজেশন করা উচিত তা নির্ধারণ করা সহজ করে তোলে।

আপনি এটিকে আপনার কোডের মধ্যে থেকে বা দোভাষীর কাছ থেকে কল করতে পারেন:

import cProfile
cProfile.run('foo()')

আরও কার্যকরভাবে, আপনি স্ক্রিপ্ট চলাকালীন সিপ্রফাইলে আবেদন করতে পারেন:

python -m cProfile myscript.py

এটিকে আরও সহজ করার জন্য, আমি 'প্রোফাইল.bat' নামে একটি ছোট ব্যাচের ফাইল তৈরি করেছি:

python -m cProfile %1

সুতরাং আমার যা করতে হবে তা চালানো:

profile euler048.py

এবং আমি এটি পেয়েছি:

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

সম্পাদনা: পাইকন 2013 থেকে একটি ভাল ভিডিও সংস্থার আপডেট হওয়া লিঙ্কটি ইউটিউবের মাধ্যমে পাইথন প্রোফাইলিং শিরোনাম ।


251
এছাড়াও ফলাফলগুলি বাছাই করা কার্যকর, এটি -s সুইচ দ্বারা করা যেতে পারে, উদাহরণস্বরূপ: '-স সময়'। আপনি संचयी / নাম / সময় / ফাইল বাছাইকরণ বিকল্পগুলি ব্যবহার করতে পারেন।
জিরি

19
এটি লক্ষণীয় যে আপনি আইপিথন থেকে সিপ্রোফাইল মডিউলটি ম্যাজিক ফাংশন% প্রুন (প্রোফাইল রান) ব্যবহার করে ব্যবহার করতে পারেন। প্রথমে আপনার মডিউলটি আমদানি করুন, এবং তারপরে% prun সহ প্রধান ফাংশনটি কল করুন: euler048 আমদানি করুন; % prun euler048.main ()
RussellStewart

53
সিপ্রোফিল ডাম্পগুলির (ভিজ্যুয়ালাইজ করার জন্য python -m cProfile -o <out.profile> <script>), রানস্নেকআরুনকেrunsnake <out.profile> মূল্যবান হিসাবে ডাকা হয়েছে
লিলি চুং

13
অজগর 3 এর জন্য @ নীলজিকে cprofileএখনও সুপারিশ করা হয় profile
ট্রাইকোপলাক্স

17
সিপ্রোফিল ডাম্পগুলি ভিজ্যুয়ালাইজ করার জন্য, রানস্নেকআরন ২০১১ সাল থেকে আপডেট করা হয়নি এবং পাইথন 3 সমর্থন করে না। পরিবর্তে আপনার স্নাপভিজ ব্যবহার করা উচিত
গিয়াকোমো টেক্যা পিগানি

423

কিছুক্ষণ আগে আমি তৈরি করেছি pycallgraphযা আপনার পাইথন কোড থেকে ভিজ্যুয়ালাইজেশন উত্পন্ন করে। সম্পাদনা করুন: আমি এই লেখার সর্বশেষ প্রকাশের 3.3 দিয়ে কাজ করার জন্য উদাহরণটি আপডেট করেছি।

পরে pip install pycallgraphও ইনস্টল Graphviz কমান্ড লাইন থেকে এটি চালানোর করতে পারেন:

pycallgraph graphviz -- ./mypythonscript.py

অথবা, আপনি আপনার কোডের নির্দিষ্ট অংশগুলি প্রোফাইল করতে পারেন:

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

এর যে কোনওটি pycallgraph.pngনীচের চিত্রের অনুরূপ একটি ফাইল তৈরি করবে :

এখানে চিত্র বর্ণনা লিখুন


43
আপনি কি কলগুলির পরিমাণের উপর ভিত্তি করে রঙ করছেন? যদি তা হয় তবে আপনার সময়ের উপর ভিত্তি করে রঙ করা উচিত কারণ সর্বাধিক কলগুলির সাথে ফাংশনটি সবসময় সর্বাধিক সময় নেয় এমনটি হয় না।
লাল

21
@red আপনি নিজের পছন্দ মতো রঙগুলি এবং প্রতিটি পরিমাপের জন্য স্বতন্ত্রভাবে কাস্টমাইজ করতে পারেন। উদাহরণস্বরূপ কলগুলির জন্য লাল, সময়ের জন্য নীল, মেমরির ব্যবহারের জন্য সবুজ।

2
এই ত্রুটিটি Traceback (most recent call last): /pycallgraph.py", line 90, in generate output.done() File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 94, in done source = self.generate() File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 143, in generate indent_join.join(self.generate_attributes()), File "/net_downloaded/pycallgraph-develop/pycallgraph/output/graphviz.py", line 169, in generate_attributes section, self.attrs_from_dict(attrs), ValueError: zero length field name in format
পেয়েছে

3
আমি বর্ণিত হিসাবে কাজ করার জন্য আপনার গ্রাফভিজ ইনস্টল করতে হবে তা উল্লেখ করার জন্য এটি আপডেট করেছি। উবুন্টু এ ঠিক sudo apt-get install graphviz
mlissner

2
এখানে ইনস্টল করতে এটির জন্য কিছুটা কাজ প্রয়োজন সাহায্যের 3 টি পদক্ষেপ। 1. পাইপের মাধ্যমে ইনস্টল করুন, 2. উদাহরণের মাধ্যমে গ্রাফভিজ ইনস্টল করুন 3. গ্রাফভিজ ডিরেক্টরিতে পাথ ভেরিয়েবল সেট আপ করুন 4. অন্যান্য সমস্ত ত্রুটিগুলি কীভাবে ঠিক করবেন তা নির্ধারণ করুন। ৫. এটি পিএনজি ফাইলটি কোথায় সংরক্ষণ করে?
মার্শ

199

এটি উল্লেখ করার মতো যে, প্রোফাইলারটি কেবল মূল থ্রেডে (ডিফল্টরূপে) কাজ করে এবং আপনি অন্য থ্রেড থেকে কোনও তথ্য পাবেন না যদি আপনি সেগুলি ব্যবহার করেন। এটি প্রোফাইলের ডকুমেন্টেশনে সম্পূর্ণরূপে নিঃসরণযুক্ত হওয়ায় এটি কিছুটা গোটচা হতে পারে ।

আপনি যদি প্রোফাইল থ্রেডগুলিও দেখতে চান তবে আপনি ডক্সে threading.setprofile()ফাংশনটি দেখতে চাইবেন ।

এটি করার জন্য আপনি নিজের threading.Threadউপক্লাসটি তৈরি করতে পারেন:

class ProfiledThread(threading.Thread):
    # Overrides threading.Thread.run()
    def run(self):
        profiler = cProfile.Profile()
        try:
            return profiler.runcall(threading.Thread.run, self)
        finally:
            profiler.dump_stats('myprofile-%d.profile' % (self.ident,))

এবং ProfiledThreadস্ট্যান্ডার্ডের পরিবর্তে সেই ক্লাসটি ব্যবহার করুন । এটি আপনাকে আরও নমনীয়তা দিতে পারে তবে আমি নিশ্চিত নই যে এটির জন্য এটির মূল্য রয়েছে বিশেষত আপনি যদি তৃতীয় পক্ষের কোড ব্যবহার করেন যা আপনার শ্রেণিটি ব্যবহার করে না।


1
নথিতে আমি রানকলের কোনও রেফারেন্স দেখতে পাচ্ছি না। সিপ্রোফিল.পি.কে এক ঝলক দেওয়া, আপনি কেন থ্রেডিং ব্যবহার করছেন তা আমি নিশ্চিত নই h থ্রেড.আরুন ফাংশন বা তর্ক হিসাবে নিজেকে স্ব। আমি এখানে অন্য থ্রেডের রান পদ্ধতির একটি রেফারেন্স দেখতে আশা করতাম ।
পাইপব্রস

এটি নথিতে নেই, তবে এটি মডিউলে রয়েছে। Hg.python.org/cpython/file/6bf07db23445/Lib/cProfile.py#l140 দেখুন । এটি আপনাকে একটি নির্দিষ্ট ফাংশন কল প্রোফাইল করতে দেয় এবং আমাদের ক্ষেত্রে আমরা থ্রেডের targetফাংশনটি প্রোফাইল করতে চাই , যা threading.Thread.run()কলটি কার্যকর করে। তবে আমি যেহেতু উত্তরে বলেছি, থ্রেড সাবক্লাস করার পক্ষে এটি সম্ভবত উপযুক্ত নয়, যেহেতু কোনও তৃতীয় পক্ষের কোড এটি ব্যবহার করবে না এবং এর পরিবর্তে ব্যবহার করবে threading.setprofile()
জো শ

9
প্রোফাইলআরনেবল () এবং প্রোফাইলআর ডিজেবল () এর সাহায্যে কোড মোড়ানো খুব ভালভাবে কাজ করে বলে মনে হচ্ছে। এটি মূলত রানকল কী করে এবং এটি কোনও সংখ্যক যুক্তি বা অনুরূপ জিনিস প্রয়োগ করে না।
পাইপব্রোস

1
আমি আমার নিজের মিলিত stackoverflow.com/questions/10748118/... সঙ্গে ddaa.net/blog/python/lsprof-calltree এবং এটি কাজ করে kindof; -!)
দিমা Tisnek

1
জো, আপনি কী জানেন যে প্রোফাইলার কীভাবে পাইথন ৩.৪ এ অ্যাসিনসিওর সাথে অভিনয় করে?
নিক চ্যামাস

148

পাইথন উইকি প্রোফাইলিং সম্পদের জন্য একটি দুর্দান্ত পৃষ্ঠা হল: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code

পাইথন ডক্সের মতো: http://docs.python.org/library/profile.html

ক্রিস ললোর দেখানো হয়েছে সিপিপ্রোফিল একটি দুর্দান্ত সরঞ্জাম এবং সহজেই স্ক্রিনে মুদ্রণ করতে ব্যবহার করা যেতে পারে:

python -m cProfile -s time mine.py <args>

বা ফাইল করতে:

python -m cProfile -o output.file mine.py <args>

PS> আপনি যদি উবুন্টু ব্যবহার করেন তবে পাইথন-প্রোফাইল ইনস্টল করার বিষয়টি নিশ্চিত করুন

apt-get install python-profiler 

আপনি যদি ফাইলটি আউটপুট করে থাকেন তবে নীচের সরঞ্জামগুলি ব্যবহার করে দুর্দান্ত ভিজ্যুয়ালাইজেশন পেতে পারেন

পাইক্যালগ্রাফ: কল গ্রাফের চিত্রগুলি
ইনস্টল করার একটি সরঞ্জাম :

 pip install pycallgraph

সঞ্চালন করুন:

 pycallgraph mine.py args

দেখুন:

 gimp pycallgraph.png

আপনি পিএনজি ফাইল দেখতে যা পছন্দ করেন তা ব্যবহার করতে পারেন, আমি জিম ব্যবহার
করেছি দুর্ভাগ্যক্রমে আমি প্রায়শই পাই

বিন্দু: কায়রো-উপস্থাপনকারী বিটম্যাপের জন্য গ্রাফটি খুব বড়। ফিট করার জন্য 0.257079 দ্বারা স্কেলিং

যা আমার চিত্রগুলি অসাধারণভাবে ছোট করে তোলে। সুতরাং আমি সাধারণত এসভিজি ফাইলগুলি তৈরি করি:

pycallgraph -f svg -o pycallgraph.svg mine.py <args>

পিএস> গ্রাফভিজ ইনস্টল করার বিষয়টি নিশ্চিত করুন (যা ডট প্রোগ্রাম সরবরাহ করে):

pip install graphviz

@ ম্যাক্সি / @ কোডলিবেটরের মাধ্যমে জিআরফোফডডট ব্যবহার করে বিকল্প গ্রাফিং:

pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg

12
gprof2dot এই গ্রাফগুলিও করতে পারে। আমি মনে করি আউটপুটটি কিছুটা সুন্দর ( উদাহরণ )।
ম্যাক্সি

2
যদি আপনি ওএসএক্স ব্যবহার করে থাকেন তবে গ্রাফভিজটিও প্রয়োজনীয়
বৈভব মিশ্র

134

@ ম্যাক্সির এই উত্তরের মন্তব্যটি আমাকে যথেষ্ট পরিমাণে সহায়তা করেছে যা আমি মনে করি এটির নিজের উত্তরটির প্রাপ্য: আমার কাছে ইতিমধ্যে সিপ্রোফিল-উত্পাদিত .pstats ফাইল ছিল এবং আমি পাইক্যালগ্রাফ দিয়ে জিনিসগুলি পুনরায় চালিত করতে চাই না, তাই আমি জিআরফোফ 2 ডট ব্যবহার করেছি এবং সুন্দর হয়ে উঠছি svgs:

$ sudo apt-get install graphviz
$ git clone https://github.com/jrfonseca/gprof2dot
$ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin
$ cd $PROJECT_DIR
$ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg

আর বিএলএম!

এটি বিন্দু ব্যবহার করে (পাইকলগ্রাফ ব্যবহার করে এমন একই জিনিস) তাই আউটপুট একই রকম দেখায়। আমি এই ধারণাটি পেয়েছি যে gprof2dot যদিও কম তথ্য হারিয়েছে:

gprof2dot উদাহরণ আউটপুট


1
ভাল পন্থা, আপনি ক্রোম ইত্যাদিতে এসভিজি দেখতে এবং এটিকে নীচে / নীচে স্কেল করতে পারার মতোই সত্যিই ভাল কাজ করে। তৃতীয় লাইনে টাইপ রয়েছে, হওয়া উচিত: ln -s pwd/gprof2dot/gprof2dot.py OME হোম / বিন (অথবা বেশিরভাগ শেলগুলিতে ln -s $ PWD / gprof2dot / gprof2dot.py ~ / বিন ব্যবহার করুন - গুরুতর অ্যাকসেন্ট প্রথমে ফর্ম্যাটিং হিসাবে নেওয়া হয় সংস্করণ)।
রিচভেল

2
আহ, ভাল কথা। আমি lnপ্রায় প্রতিবারই তর্ক-আদেশটি ভুল হয়ে যাই ।
কোডলিবিটার

7
কৌশলটি মনে রাখতে হবে যে এলএন এবং সিপির একই আর্গুমেন্ট অর্ডার রয়েছে - এটিকে 'ফাইল 2 বা ডিআর 2 তে ফাইল 1 অনুলিপি করে ভাবেন, তবে একটি লিঙ্ক তৈরি করা'
রিচভেল

এটি উপলব্ধি করে, আমি মনে করি ম্যানপেজে "টারগেট" ব্যবহারটি আমাকে ছুঁড়ে ফেলে।
কোডলিবিটার

দয়া করে, আপনি গোলাকার কোণগুলি কীভাবে পেলেন? আমি অনুভব করি এটি পাঠযোগ্যতার উন্নতি করে। আমি কেবল কুরুচিপূর্ণ ধারালো কোণ পেয়েছি যা বাক্সের চারপাশে অনেক প্রান্তের উপস্থিতিতে শীতল নয়।
Hibou57

77

এই বিষয়টি গবেষণা করার সময় আমি স্নেকভিজ নামে একটি সহজ সরঞ্জামে চলে এসেছিলাম । স্নেকভিজ একটি ওয়েব-ভিত্তিক প্রোফাইলিং ভিজ্যুয়ালাইজেশন সরঞ্জাম। এটি ইনস্টল এবং ব্যবহার করা খুব সহজ। আমি এটির যে স্বাভাবিক %prunপদ্ধতিটি ব্যবহার করি তা হ'ল স্টেপ ফাইল তৈরি করা এবং তারপরে স্নেকভিজে বিশ্লেষণ করা।

ব্যবহৃত মূল মূল কৌশলটি হ'ল সানবার্স্ট চার্টটি নীচে দেখানো হয়েছে, যাতে ফাংশন কলগুলির শ্রেণিবিন্যাসকে তাদের কৌনিক প্রস্থে এনকোড করা আর্ক এবং সময় তথ্য স্তর হিসাবে সাজানো হয়েছে।

সেরা জিনিসটি হল আপনি চার্টটির সাথে ইন্টারঅ্যাক্ট করতে পারেন। উদাহরণস্বরূপ, একটিকে জুম করতে একটি চকে ক্লিক করতে পারে এবং আরও বিবরণ প্রদর্শন করার জন্য আরক এবং এর বংশধরদের একটি নতুন সানবার্স্ট হিসাবে বড় করা হবে।

এখানে চিত্র বর্ণনা লিখুন


1
কোডকবির উত্তরটিতে (সংক্ষিপ্ত) ইনস্টলেশন নির্দেশাবলী অন্তর্ভুক্ত রয়েছে এবং কীভাবে (সহজেই) স্নেকভিজ ব্যবহার করা যায় তা দেখানো হয়েছে।
ওরেেন মিলম্যান

এখানে আমি আইএমএইচও-র উত্তম গাইডটি পড়েছি কীভাবে কীভাবে জ্যুপিটার নোটবুকে পাইথনের জন্য প্রোফাইলিং ব্যবহার করতে হবে: ਪਾਸੇ ডেটাসায়েন্স
আলেক্সি মার্টিয়ানভ

72

সর্বদা কোথায় চলছে তা খুঁজে পাওয়ার সহজতম এবং দ্রুততম উপায়।

1. pip install snakeviz

2. python -m cProfile -o temp.dat <PROGRAM>.py

3. snakeviz temp.dat

একটি ব্রাউজারে পাই চার্ট আঁকুন। সবচেয়ে বড় অংশটি হ'ল সমস্যাটি। খুব সহজ.


1
এটি খুব সহায়ক ছিল। ধন্যবাদ.
জিপ্পিজো 4

55

আমি মনে করি এটি cProfileপ্রোফাইলের পক্ষে দুর্দান্ত, তবে kcachegrindফলাফলটি দেখার জন্য দুর্দান্ত। pyprof2calltreeফাইল রূপান্তর হ্যান্ডলগুলি মধ্যে।

python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree

প্রয়োজনীয় সরঞ্জামগুলি ইনস্টল করতে (কমপক্ষে উবুন্টুতে):

apt-get install kcachegrind
pip install pyprof2calltree

ফলাফল:

ফলাফলের স্ক্রিনশট


9
ম্যাক ব্যবহারকারীগণ সফল প্রোফাইলিংয়ের বিবরণ সহ brew install qcachegrindপ্রতিটি ইনস্টল ও সাবস্টিটিউট করেন । kcachegrindqcachegrind
কেভিন কাটজকে

এটি কাজ করার জন্য আমাকে এই কাজটি করতে হয়েছিল:export QT_X11_NO_MITSHM=1
ইয়োনাতান সিমসন

41

এছাড়াও উল্লেখযোগ্য মূল্য হ'ল জিইউআই সিপ্রোফাইল ডাম্প ভিউয়ার রানসনেকরুন । এটি আপনাকে বাছাই এবং নির্বাচন করতে দেয়, যার ফলে প্রোগ্রামের প্রাসঙ্গিক অংশগুলিতে জুম করে। ছবিতে আয়তক্ষেত্রগুলির আকারগুলি নেওয়া সময়ের সাথে সমানুপাতিক। আপনি যদি কোনও আয়তক্ষেত্রের উপরে মাউস করেন এটি টেবিলে এবং মানচিত্রের যে কোনও জায়গায় কলটি হাইলাইট করে। আপনি যখন কোনও আয়তক্ষেত্রটিতে ডাবল ক্লিক করেন তখন সে অংশটি জুম হয়ে যায়। এটি আপনাকে দেখায় যে এই অংশটি কে কল করে এবং সেই অংশটি কী কল করে।

বর্ণনামূলক তথ্য খুব সহায়ক। এটি আপনাকে সেই বিটের কোড দেখাচ্ছে যা আপনি বিল্ট-ইন লাইব্রেরি কলগুলির সাথে ডিল করার সময় সহায়ক হতে পারে। কোডটি কী সন্ধান করতে হবে তা আপনাকে জানায়।

এছাড়াও এটি উল্লেখ করতে চান যে ওপি 'প্রোফাইলিং' বলেছিল তবে এটি প্রদর্শিত হয় তার অর্থ ছিল 'সময়'। মনে রাখবেন প্রোগ্রামগুলি ধীরে ধীরে চলবে।

এখানে চিত্র বর্ণনা লিখুন


34

একটি দুর্দান্ত প্রোফাইলিং মডিউল হ'ল লাইন_প্রফিলার (স্ক্রিপ্টটি কর্নপ্রফ.পি ব্যবহার করে বলা হয়)। এটি এখানে ডাউনলোড করা যায়

আমার উপলব্ধি হ'ল সিপ্রোফাইল কেবল প্রতিটি ফাংশনে ব্যয় করা মোট সময় সম্পর্কে তথ্য দেয়। কোডের স্বতন্ত্র লাইনগুলি সময়সাপেক্ষ হয় না। এটি বৈজ্ঞানিক কম্পিউটিংয়ের একটি সমস্যা কারণ প্রায়শই একটি একক লাইন অনেক সময় নিতে পারে। এছাড়াও, যেমনটি আমার মনে আছে, সিপিপ্রফিল নম্পপি.ডট বলতে ব্যয় করার সময়টি ধরেনি।


34

আমি সম্প্রতি পাইথন রানটাইম এবং প্রোফাইল আমদানি করার জন্য টুনা তৈরি করেছি ; এটি এখানে সহায়ক হতে পারে।

এখানে চিত্র বর্ণনা লিখুন

সাথে ইনস্টল করুন

pip install tuna

একটি রানটাইম প্রোফাইল তৈরি করুন

python3 -m cProfile -o program.prof yourfile.py

বা একটি আমদানি প্রোফাইল (পাইথন 3.7++ প্রয়োজন)

python3 -X importprofile yourfile.py 2> import.log

তারপরে ফাইলটিতে শুধু টুনা চালান

tuna program.prof

33

pprofile

line_profiler(ইতিমধ্যে এখানে উপস্থাপিত) এছাড়াও অনুপ্রাণিত pprofile, যা হিসাবে বর্ণনা করা হয়েছে:

লাইন-গ্রানুলারিটি, থ্রেড-সচেতন ডিটারমিনিস্টিক এবং পরিসংখ্যান বিশুদ্ধ-পাইথন প্রোফাইলার

এটি লাইন-গ্রানুলারিলিটি সরবরাহ করে যেমন line_profilerখাঁটি পাইথন, এটি স্ট্যান্ড্যালোন কমান্ড বা মডিউল হিসাবে ব্যবহার করা যেতে পারে এবং এমনকি কলগ্রাইন্ড-ফর্ম্যাট ফাইলও তৈরি করতে পারে যা সহজে বিশ্লেষণ করা যায় [k|q]cachegrind

vprof

এছাড়াও ভিপিআরফ রয়েছে , পাইথন প্যাকেজ হিসাবে বর্ণিত:

[...] পাইথন প্রোগ্রামের বিভিন্ন বৈশিষ্ট্য যেমন চলমান সময় এবং মেমরির ব্যবহারের জন্য সমৃদ্ধ এবং ইন্টারেক্টিভ ভিজুয়ালাইজেশন সরবরাহ করে।

তাপ মানচিত্র


14

অনেক দুর্দান্ত উত্তর রয়েছে তবে তারা প্রোফাইলটি লেখার জন্য এবং / বা ফলাফলগুলি বাছাইয়ের জন্য কমান্ড লাইন বা কিছু বাহ্যিক প্রোগ্রাম ব্যবহার করে।

কমান্ড লাইনে স্পর্শ না করে বা কিছু না ইনস্টল করে আমি আমার আইডিই (এক্সপ্লিপ-পাইডিভ) ব্যবহার করতে পারে এমন কোনও উপায় সত্যিই মিস করেছি। সুতরাং এটি এখানে।

কমান্ড লাইন ছাড়াই প্রোফাইলিং

def count():
    from math import sqrt
    for x in range(10**5):
        sqrt(x)

if __name__ == '__main__':
    import cProfile, pstats
    cProfile.run("count()", "{}.profile".format(__file__))
    s = pstats.Stats("{}.profile".format(__file__))
    s.strip_dirs()
    s.sort_stats("time").print_stats(10)

দেখুন ডক্স আরও তথ্যের জন্য বা অন্যান্য উত্তর।


উদাহরণস্বরূপ, প্রোফাইলটি মুদ্রণ করে {মানচিত্র} বা {xxx}} আমি কীভাবে জানতে পারি যে পদ্ধতিটি file xxx which কোন ফাইল থেকে ডাকা হয়? আমার প্রোফাইল প্রিন্ট করে '' zlib.Compress 'অবজেক্টগুলির' পদ্ধতি 'সংক্ষেপণ' most বেশিরভাগ সময় নেয় তবে আমি কোনও জেলিব ব্যবহার করি না, তাই আমি অনুমান করি যে কিছু কল নম্পি ফাংশন এটি ব্যবহার করতে পারে। ঠিক কী ফাইল এবং লাইনটি অনেক সময় নেয় তা আমি কীভাবে জানতে পারি?
মাচেন

12

প্রত্যাশার মতো মাল্টি-থ্রেডেড কোডটি কাজ না করার বিষয়ে জো শ-এর উত্তর অনুসরণ করার পরে, আমি বুঝতে পেরেছি যে runcallসিপ্রোফাইলে পদ্ধতিটি কেবলমাত্র করা হচ্ছে self.enable()এবং self.disable()প্রোফাইল ফাংশন কলটির চারপাশে কল করে, তাই আপনি কেবল নিজেরাই এটি করতে পারেন এবং যে কোডের সাথে আপনি চান সেটি থাকতে পারে বিদ্যমান কোডের সাথে ন্যূনতম হস্তক্ষেপ।


3
দুর্দান্ত টিপ! এ দ্রুত উঁকি cprofile.pyএর সোর্স কোড যে reveals ঠিক কি runcall()না। আরও সুনির্দিষ্ট হওয়ার সাথে সাথে একটি প্রোফাইল দৃষ্টান্ত তৈরি করার পরে prof = cprofile.Profile()অবিলম্বে কল করুন prof.disable()এবং তারপরে কেবল আপনি যে কোডটি প্রোফাইল চান সেটি বিভাগের চারপাশে যুক্ত করুন prof.enable()এবং prof.disable()কল করুন ।
মার্টিনো

এটি খুব সহায়ক, তবে মনে হয় এটি সক্ষম এবং অক্ষম করার মধ্যে থাকা কোডটি প্রোফাইল করা হয় না - কেবলমাত্র এটি ফাংশন বলে calls আমার কি এই অধিকার আছে? মুদ্রণ_স্ট্যাটস () এর যে কোনও সংখ্যার দিকে গণনা করার জন্য আমাকে একটি কোডটি একটি ফাংশনে কল করতে হবে।
বব স্টেইন

10

Virtaal এর দশকে সোর্স খুব দরকারী শ্রেণী এবং প্রসাধক প্রোফাইলিং (নির্দিষ্ট পদ্ধতি / ফাংশন জন্যও) খুব সহজ করতে পারেন যে আছে। আউটপুটটি তখন কেসিচেগ্রিন্ডে খুব স্বাচ্ছন্দ্যে দেখা যায়।


1
এই রত্নের জন্য আপনাকে ধন্যবাদ। এফওয়াইআই: এটি কোনও কোড সহ স্ট্যান্ড্যালোন মডিউল হিসাবে ব্যবহার করা যেতে পারে, ভার্টাল কোড বেসের প্রয়োজন হয় না। কেবল প্রোফাইলিং.পিতে ফাইলটি সংরক্ষণ করুন এবং প্রোফাইল_ফঙ্ক () আমদানি করুন। আপনার প্রোফাইল এবং ভায়োলা করতে হবে এমন কোনও ক্রিয়াকলাপকে ডেকরেটার হিসাবে @ প্রোফাইলে_ফুনস () ব্যবহার করুন। :)
আমজিথ

9

সিপ্রোফাইল দ্রুত প্রোফাইলিংয়ের জন্য দুর্দান্ত তবে বেশিরভাগ সময় এটি আমার জন্য ত্রুটিগুলি সহ শেষ হয়েছিল। ফাংশন রানেক্টেক্স সঠিকভাবে পরিবেশ এবং ভেরিয়েবলগুলির সূচনা করে এই সমস্যাটি সমাধান করে, আশা করি এটি কারও পক্ষে কার্যকর হতে পারে:

import cProfile
cProfile.runctx('foo()', None, locals())

7

আপনি যদি একটি ক্রমযুক্ত প্রোফাইলার বানাতে চান, যার অর্থ একাধিকবার ফাংশনটি চালানো এবং ফলাফলগুলির যোগফলটি দেখুন।

আপনি এই cumulative_profilerসাজসজ্জা ব্যবহার করতে পারেন :

এটি অজগর> = 3.6 নির্দিষ্ট, তবে আপনি এটি সরাতে পারেন nonlocalএটি পুরানো সংস্করণে কাজ করে।

import cProfile, pstats

class _ProfileFunc:
    def __init__(self, func, sort_stats_by):
        self.func =  func
        self.profile_runs = []
        self.sort_stats_by = sort_stats_by

    def __call__(self, *args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()  # this is the profiling section
        retval = self.func(*args, **kwargs)
        pr.disable()

        self.profile_runs.append(pr)
        ps = pstats.Stats(*self.profile_runs).sort_stats(self.sort_stats_by)
        return retval, ps

def cumulative_profiler(amount_of_times, sort_stats_by='time'):
    def real_decorator(function):
        def wrapper(*args, **kwargs):
            nonlocal function, amount_of_times, sort_stats_by  # for python 2.x remove this row

            profiled_func = _ProfileFunc(function, sort_stats_by)
            for i in range(amount_of_times):
                retval, ps = profiled_func(*args, **kwargs)
            ps.print_stats()
            return retval  # returns the results of the function
        return wrapper

    if callable(amount_of_times):  # incase you don't want to specify the amount of times
        func = amount_of_times  # amount_of_times is the function in here
        amount_of_times = 5  # the default amount
        return real_decorator(func)
    return real_decorator

উদাহরণ

ফাংশন প্রোফাইলিং baz

import time

@cumulative_profiler
def baz():
    time.sleep(1)
    time.sleep(2)
    return 1

baz()

baz 5 বার দৌড়ে এবং এটি মুদ্রিত:

         20 function calls in 15.003 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       10   15.003    1.500   15.003    1.500 {built-in method time.sleep}
        5    0.000    0.000   15.003    3.001 <ipython-input-9-c89afe010372>:3(baz)
        5    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

সময়ের পরিমাণ উল্লেখ করে

@cumulative_profiler(3)
def baz():
    ...

7

কেবলমাত্র টার্মিনাল সমাধান (এবং সহজতম) সমাধান, যদি সেই সমস্ত অভিনব UI ইনস্টল করতে বা চালাতে ব্যর্থ হয়: সম্পূর্ণ
উপেক্ষা করুন cProfileএবং এটির সাথে প্রতিস্থাপন করুন pyinstrument, যা মৃত্যুদন্ড কার্যকর হওয়ার পরে কলগুলির গাছ সংগ্রহ এবং প্রদর্শন করবে।

ইনস্টল করুন:

$ pip install pyinstrument

প্রোফাইল এবং প্রদর্শন ফলাফল:

$ python -m pyinstrument ./prog.py

পাইথন 2 এবং 3 নিয়ে কাজ করে।

[সম্পাদনা] কোডের কেবলমাত্র একটি অংশ প্রোফাইল করার জন্য, এপিআই-র ডকুমেন্টেশন এখানে পাওয়া যাবে


6

আমার উপায় হ'ল ইয়াপি ( https://github.com/sumerc/yappi ) ব্যবহার করা । এটি আরপিসি সার্ভারের সাথে বিশেষত দরকারী যেখানে প্রোফাইলিং তথ্য শুরু, থামাতে এবং মুদ্রণের জন্য আপনি পদ্ধতিটি নিবন্ধভুক্ত করেন, যেমন:

@staticmethod
def startProfiler():
    yappi.start()

@staticmethod
def stopProfiler():
    yappi.stop()

@staticmethod
def printProfiler():
    stats = yappi.get_stats(yappi.SORTTYPE_TTOT, yappi.SORTORDER_DESC, 20)
    statPrint = '\n'
    namesArr = [len(str(stat[0])) for stat in stats.func_stats]
    log.debug("namesArr %s", str(namesArr))
    maxNameLen = max(namesArr)
    log.debug("maxNameLen: %s", maxNameLen)

    for stat in stats.func_stats:
        nameAppendSpaces = [' ' for i in range(maxNameLen - len(stat[0]))]
        log.debug('nameAppendSpaces: %s', nameAppendSpaces)
        blankSpace = ''
        for space in nameAppendSpaces:
            blankSpace += space

        log.debug("adding spaces: %s", len(nameAppendSpaces))
        statPrint = statPrint + str(stat[0]) + blankSpace + " " + str(stat[1]).ljust(8) + "\t" + str(
            round(stat[2], 2)).ljust(8 - len(str(stat[2]))) + "\t" + str(round(stat[3], 2)) + "\n"

    log.log(1000, "\nname" + ''.ljust(maxNameLen - 4) + " ncall \tttot \ttsub")
    log.log(1000, statPrint)

তারপরে আপনার প্রোগ্রামটি কাজ করার সময় আপনি startProfilerআরপিসি পদ্ধতিতে কল করে প্রোফাইলার শুরু করতে পারেন এবং কলিংয়ের মাধ্যমে লগ ফাইলটিতে প্রোফাইলিং তথ্য ডাম্প printProfilerকরতে পারেন (বা কলটিকে ফেরত দেওয়ার জন্য আরপিসি পদ্ধতিটি পরিবর্তন করুন) এবং এই জাতীয় আউটপুট পান:

2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
name                                                                                                                                      ncall     ttot    tsub
2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
C:\Python27\lib\sched.py.run:80                                                                                                           22        0.11    0.05
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\xmlRpc.py.iterFnc:293                                                22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\serverMain.py.makeIteration:515                                                    22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\PicklingXMLRPC.py._dispatch:66                                       1         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.date_time_string:464                                                                                    1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py._get_raw_meminfo:243     4         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.decode_request_content:537                                                                          1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py.get_system_cpu_times:148 4         0.0     0.0
<string>.__new__:8                                                                                                                        220       0.0     0.0
C:\Python27\lib\socket.py.close:276                                                                                                       4         0.0     0.0
C:\Python27\lib\threading.py.__init__:558                                                                                                 1         0.0     0.0
<string>.__new__:8                                                                                                                        4         0.0     0.0
C:\Python27\lib\threading.py.notify:372                                                                                                   1         0.0     0.0
C:\Python27\lib\rfc822.py.getheader:285                                                                                                   4         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.handle_one_request:301                                                                                  1         0.0     0.0
C:\Python27\lib\xmlrpclib.py.end:816                                                                                                      3         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.do_POST:467                                                                                         1         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.is_rpc_path_valid:460                                                                               1         0.0     0.0
C:\Python27\lib\SocketServer.py.close_request:475                                                                                         1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\__init__.py.cpu_times:1066               4         0.0     0.0 

এটি সংক্ষিপ্ত স্ক্রিপ্টগুলির জন্য খুব কার্যকর নাও হতে পারে তবে সার্ভার-টাইপ প্রক্রিয়াগুলি বিশেষত printProfilerপদ্ধতিতে প্রদত্ত একাধিকবার বলা যেতে পারে এবং প্রোফাইলের তুলনায় যেমন বিভিন্ন প্রোগ্রাম ব্যবহারের পরিস্থিতি তুলনা করতে সহায়তা করে helps

ইয়াপ্পির নতুন সংস্করণগুলিতে, নিম্নলিখিত কোডগুলি কাজ করবে:

@staticmethod
def printProfile():
    yappi.get_func_stats().print_all()

এটি স্টুপেন্ডাস ইয়াপি নামকরণ করা উচিত নয়?
থেরালস্টাবট

দুর্ভাগ্যক্রমে উপরের কোডটি কেবল 0.62 সংস্করণে কাজ করে যা পাইপিতে উপলভ্য নয়। মডিউলটি এখানে উপলভ্য ০. sources২ উত্স থেকে সংকলন করা দরকার: github.com/nirs/yappi/reLives বা রিপোতে উইন্ডোগুলির জন্য তৈরি বিল্ডটি ব্যবহার করতে সক্ষম হবেন github.com/Girgitt/yappi/relayss
মিঃ গিরগিট

1.0 সংস্করণটির সাথে সামঞ্জস্যতা সহজেই সরবরাহ করা যেতে পারে - কমপক্ষে মুদ্রণ আউটপুটটির জন্য - প্রিন্টপ্রোফিলার ফাংশনটি সংশোধন করে: def printProfiler(): if not yappi_available: return stats = yappi.get_func_stats() stats.print_all(columns={0:("name",90), 1:("ncall", 5), 2:("tsub", 8), 3:("ttot", 8), 4:("tavg",8)}) (আমি যে মন্তব্যটি দিয়েছিলাম তাতে কোড ব্লক inোকানোর জন্য কয়েকবার চেষ্টা করার পরে ঠিক আছে a এটি একটি প্রোগ্রামিং-ভিত্তিক প্রশ্নোত্তর সাইটের পক্ষে অবিশ্বাস্যরকম কঠিন)। )
মিঃ গিরগিট

4

পাইথনে প্রোফাইলিং পরিচালনা করার জন্য একটি নতুন সরঞ্জাম হ'ল পাইভিএমমনিটর: http://www.pyvmmonitor.com/

এটিতে কিছু অনন্য বৈশিষ্ট্য রয়েছে

  • একটি চলমান (সিপিথন) প্রোগ্রামে প্রোফাইলার সংযুক্ত করুন
  • ইয়াপি ইন্টিগ্রেশন সহ প্রোফাইলে চাহিদা রয়েছে
  • একটি আলাদা মেশিনে প্রোফাইল
  • একাধিক প্রক্রিয়া সমর্থন (মাল্টিপ্রসেসিং, জাঙ্গো ...)
  • লাইভ স্যাম্পলিং / সিপিইউ দর্শন (সময়সীমা নির্বাচনের সাথে)
  • সিপ্রোফিল / প্রোফাইল ইন্টিগ্রেশনের মাধ্যমে নির্ধারিত প্রোফাইলিং
  • বিদ্যমান PStats ফলাফল বিশ্লেষণ করুন
  • ডট ফাইল খুলুন
  • প্রোগ্রামিমেটিক এপিআই অ্যাক্সেস
  • পদ্ধতি বা লাইন দ্বারা গ্রুপ নমুনা
  • পাইডেভ ইন্টিগ্রেশন
  • পাইচার্ম ইন্টিগ্রেশন

দ্রষ্টব্য: এটি বাণিজ্যিক, তবে মুক্ত উত্সের জন্য বিনামূল্যে free


4

gprof2dot_magic

gprof2dotJupyterLab বা Jupyter নোটবুকের কোনও পাইথন স্টেটমেন্টকে DOT গ্রাফ হিসাবে প্রোফাইল করার জন্য যাদু ফাংশন ।

এখানে চিত্র বর্ণনা লিখুন

গিটহাব রেপো: https://github.com/mattijn/gprof2dot_magic

স্থাপন

আপনি পাইথন প্যাকেজটি নিশ্চিত করেছেন তা নিশ্চিত করুন gprof2dot_magic

pip install gprof2dot_magic

এর নির্ভরতা gprof2dotএবং graphvizপাশাপাশি ইনস্টল করা হবে

ব্যবহার

যাদু ফাংশন সক্ষম করতে, প্রথমে gprof2dot_magicমডিউলটি লোড করুন

%load_ext gprof2dot_magic

এবং তারপরে কোনও ডট গ্রাফ হিসাবে যে কোনও লাইন বিবৃতি প্রোফাইল করুন:

%gprof2dot print('hello world')

এখানে চিত্র বর্ণনা লিখুন


3

কখনও জানতে চাই যে অজগর স্ক্রিপ্টটি কী করছে? পরিদর্শন শেলটি প্রবেশ করুন। শেল পরিদর্শন করুন আপনাকে চলমান স্ক্রিপ্ট বাধা না দিয়ে গ্লোবালগুলি মুদ্রণ / পরিবর্তন করতে এবং ফাংশন চালাতে দেয়। এখন স্বয়ংক্রিয়-সম্পূর্ণ এবং কমান্ড ইতিহাসের সাথে (কেবলমাত্র লিনাক্সে)।

পরিদর্শন শেলটি পিডিবি-স্টাইলের ডিবাগার নয়।

https://github.com/amoffat/Inspect-Shell

আপনি এটি (এবং আপনার কব্জি ঘড়ি) ব্যবহার করতে পারেন।


3

Https://stackoverflow.com/a/582337/1070617 এ যুক্ত করতে ,

আমি এই মডিউলটি লিখেছি যা আপনাকে সিপ্রোফিল ব্যবহার করতে এবং সহজেই এর আউটপুট দেখতে দেয়। আরও এখানে: https://github.com/ymichael/cprofilev

$ python -m cprofilev /your/python/program
# Go to http://localhost:4000 to view collected statistics.

এছাড়াও দেখুন: সংগৃহীত পরিসংখ্যানগুলি কীভাবে বোধগম্য করা যায় সে সম্পর্কে http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html


3

এটি প্রোফাইলের বাইরে আপনি কী দেখতে চান তার উপর নির্ভর করবে। সাধারণ সময়ের মেট্রিকগুলি (বাশ) দ্বারা দেওয়া যেতে পারে।

time python python_prog.py

এমনকি '/ usr / bin / সময়' '--verbose' পতাকা ব্যবহার করে বিস্তারিত মেট্রিক আউটপুট করতে পারে।

প্রতিটি ফাংশন দ্বারা প্রদত্ত সময় মেট্রিকগুলি পরীক্ষা করতে এবং ফাংশনে কতটা সময় ব্যয় করা হয় তা আরও ভালভাবে বুঝতে, আপনি পাইথনের ইনবিল্ট সিপ্রোফাইলটি ব্যবহার করতে পারেন।

পারফরম্যান্সের মতো আরও বিশদ মেট্রিকগুলিতে যাওয়া, সময় কেবলমাত্র মেট্রিক নয়। আপনি মেমরি, থ্রেড ইত্যাদি সম্পর্কে উদ্বেগ করতে পারেন
প্রোফাইলিং বিকল্পগুলি:
১. লাইনের_প্রফিলার হ'ল টাইমিং মেট্রিক্স লাইন বাই লাইনের সন্ধান করতে সাধারণত ব্যবহৃত অন্য প্রোফাইলার।
২. মেমরি_প্রফিলার মেমরির ব্যবহারের প্রোফাইল দেওয়ার একটি সরঞ্জাম।
৩. হিপি (প্রকল্প গুপি থেকে) প্রোফাইল কীভাবে স্তূপে থাকা বস্তুগুলি ব্যবহৃত হয়।

এগুলি আমি ব্যবহার করার প্রবণতাগুলির মধ্যে কিছু সাধারণ। তবে আপনি যদি আরও সন্ধান করতে চান তবে এই বইটি পড়ার চেষ্টা করুন এটি কর্মক্ষমতা মাথায় রেখেই শুরু করার জন্য বেশ সুন্দর একটি বই। আপনি সাইথন এবং জেআইটি (জাস্ট-ইন-টাইম) সংকলিত পাইথন ব্যবহারের বিষয়ে উন্নত বিষয়ের দিকে যেতে পারেন।


2

মত একটি পরিসংখ্যানগত প্রোফাইলার সঙ্গে অস্টিন , কোন যন্ত্রানুষঙ্গের প্রয়োজন বোধ করা হয়, যার মানে হল আপনি কেবল সঙ্গে একটি পাইথন আবেদন আউট ডেটা প্রোফাইলিং পেতে পারেন

austin python3 my_script.py

কাঁচা আউটপুট খুব কার্যকর নয়, তবে আপনি সেই তথ্যটি শিখা গ্রাফের উপস্থাপনা পেতে যা ফ্লেমগ্রাফ.পিএল করতে পারেন যা আপনাকে সময় (রিয়েল টাইমের মাইক্রোসেকেন্ডগুলিতে পরিমাপ করা) কোথায় ব্যয় হচ্ছে তার একটি ব্রেকডাউন দেয়।

austin python3 my_script.py | flamegraph.pl > my_script_profile.svg

1

এখানে একটি স্ট্যাটিস্টিকাল প্রোফাইলারও রয়েছে statprof। এটি একটি স্যাম্পলিং প্রোফাইলার, সুতরাং এটি আপনার কোডের সাথে ন্যূনতম ওভারহেড যুক্ত করে এবং লাইন-ভিত্তিক (কেবলমাত্র ফাংশন-ভিত্তিক নয়) সময় দেয়। এটি গেমগুলির মতো নরম রিয়েল-টাইম অ্যাপ্লিকেশনগুলির পক্ষে আরও উপযুক্ত, তবে সিপোফিলের চেয়ে কম নির্ভুলতা থাকতে পারে।

Pypi মধ্যে সংস্করণ একটু পুরানো, তাই সঙ্গে এটি ইনস্টল করতে পারেন pipনির্দিষ্ট করে Git সংগ্রহস্থলের :

pip install git+git://github.com/bos/statprof.py@1a33eba91899afe17a8b752c6dfdec6f05dd0c01

আপনি এটি এভাবে চালাতে পারেন:

import statprof

with statprof.profile():
    my_questionable_function()

এছাড়াও https://stackoverflow.com/a/10333592/320036 দেখুন


1

আমি সবেমাত্র পাইপ্রেফ_টাইম থেকে অনুপ্রাণিত আমার নিজস্ব প্রোফাইলার বিকাশ করেছি:

https://github.com/modaresimr/auto_profiler

একটি সাজসজ্জা যুক্ত করে এটি সময় গ্রহণকারী ফাংশনগুলির একটি গাছ দেখায়

@Profiler(depth=4, on_disable=show)

Install by: pip install auto_profiler

উদাহরণ

import time # line number 1
import random

from auto_profiler import Profiler, Tree

def f1():
    mysleep(.6+random.random())

def mysleep(t):
    time.sleep(t)

def fact(i):
    f1()
    if(i==1):
        return 1
    return i*fact(i-1)


def show(p):
    print('Time   [Hits * PerHit] Function name [Called from] [Function Location]\n'+\
          '-----------------------------------------------------------------------')
    print(Tree(p.root, threshold=0.5))

@Profiler(depth=4, on_disable=show)
def main():
    for i in range(5):
        f1()

    fact(3)


if __name__ == '__main__':
    main()

উদাহরণ আউটপুট


Time   [Hits * PerHit] Function name [Called from] [function location]
-----------------------------------------------------------------------
8.974s [1 * 8.974]  main  [auto-profiler/profiler.py:267]  [/test/t2.py:30]
├── 5.954s [5 * 1.191]  f1  [/test/t2.py:34]  [/test/t2.py:14]
   └── 5.954s [5 * 1.191]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
       └── 5.954s [5 * 1.191]  <time.sleep>
|
|
|   # The rest is for the example recursive function call fact
└── 3.020s [1 * 3.020]  fact  [/test/t2.py:36]  [/test/t2.py:20]
    ├── 0.849s [1 * 0.849]  f1  [/test/t2.py:21]  [/test/t2.py:14]
       └── 0.849s [1 * 0.849]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
           └── 0.849s [1 * 0.849]  <time.sleep>
    └── 2.171s [1 * 2.171]  fact  [/test/t2.py:24]  [/test/t2.py:20]
        ├── 1.552s [1 * 1.552]  f1  [/test/t2.py:21]  [/test/t2.py:14]
           └── 1.552s [1 * 1.552]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
        └── 0.619s [1 * 0.619]  fact  [/test/t2.py:24]  [/test/t2.py:20]
            └── 0.619s [1 * 0.619]  f1  [/test/t2.py:21]  [/test/t2.py:14]

0

যখন আমি সার্ভারে রুট নই, আমি lsprofcalltree.py ব্যবহার করি এবং আমার প্রোগ্রামটি এভাবে চালিত করি:

python lsprofcalltree.py -o callgrind.1 test.py

তারপরে আমি যে কোনও কলগ্রাইন্ড-সামঞ্জস্যপূর্ণ সফ্টওয়্যার, যেমন qcachegrind সহ খোলার জন্য রিপোর্টটি খুলতে পারি


0

আইপিথন নোটবুকে আপনার কোড স্নিপেটের জন্য দ্রুত প্রোফাইলের পরিসংখ্যান পাওয়ার জন্য। যে কেউ লাইন_প্রোফেলার এবং মেমরি_ প্রোফেলারটি সরাসরি তাদের নোটবুকগুলিতে এম্বেড করতে পারে।

এটা নাও!

!pip install line_profiler
!pip install memory_profiler

এটি লোড!

%load_ext line_profiler
%load_ext memory_profiler

এটা ব্যবহার করো!


% সময়ের

%time print('Outputs CPU time,Wall Clock time') 
#CPU times: user 2 µs, sys: 0 ns, total: 2 µs Wall time: 5.96 µs

দেয়:

  • সিপিইউ বার: সিপিইউ স্তর নির্বাহের সময়
  • সিস্টেম সময়: সিস্টেম স্তর প্রয়োগের সময়
  • মোট: সিপিইউ সময় + সিস্টেম সময়
  • ওয়াল সময়: ওয়াল ক্লক সময়

% timeit

%timeit -r 7 -n 1000 print('Outputs execution time of the snippet') 
#1000 loops, best of 7: 7.46 ns per loop
  • লুপিং (এন) বারে প্রদত্ত সংখ্যক রান (আর) এর মধ্যে সেরা সময় দেয়।
  • সিস্টেম ক্যাশে সম্পর্কিত আউটপুট বিশদ:
    • কোড স্নিপেটগুলি একাধিকবার মৃত্যুদন্ড কার্যকর করা হলে, সিস্টেমটি কয়েক ধরণের অপ্পেরেশনকে ক্যাশে করে এবং সেগুলি আবার কার্যকর করে না যা প্রোফাইল রিপোর্টের যথার্থতাকে বাধাগ্রস্ত করতে পারে।

% prun

%prun -s cumulative 'Code to profile' 

দেয়:

  • ফাংশন কলগুলির সংখ্যা (এনসিএল)
  • ফাংশন কল প্রতি এন্ট্রি আছে (স্বতন্ত্র)
  • প্রতি কল প্রতি সময় নেওয়া (পার্কল)
  • সেই ফাংশন কল (কামটাইম) পর্যন্ত সময় অতিবাহিত
  • ইত্যাদি নামক ফানক / মডিউলটির নাম ...

ক্রমযুক্ত প্রোফাইল


% memit

%memit 'Code to profile'
#peak memory: 199.45 MiB, increment: 0.00 MiB

দেয়:

  • স্মৃতি এর ব্যবহার

% lprun

#Example function
def fun():
  for i in range(10):
    print(i)

#Usage: %lprun <name_of_the_function> function
%lprun -f fun fun()

দেয়:

  • লাইন অনুযায়ী পরিসংখ্যান

LineProfile

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.