Ë ‚Ö¦iirãóΗdZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZgd¢Zee«Gd„d ««Ze d ¬ «Gd „d ««Ze d ¬ «Gd„d««ZGd„d«ZGd„d«Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zedk(r¬ddlZ ddlZGd„dej@«Z!e"ejF«dkDrejFdZ$ndZ$ e!e$«Z%ejFddD]Z&e%jOe&«Œe(d e%jR¬!«e%jU«e(d"e%jR¬!«yy#e$rYŒ«wxYw#e+$rYywxYw)#z3Class for printing reports on profiled python code.éN)ÚStrEnumÚ _simple_enum)Ú cmp_to_key)Ú dataclass)ÚDict)ÚStatsÚSortKeyÚFunctionProfileÚ StatsProfilecó6—eZdZdZdZdZdZdZdZdZ dZ d Z d „Z y ) r )ÚcallsÚncalls)Ú cumulativeÚcumtime)ÚfilenameÚmoduleÚlineÚnameÚnflÚpcallsÚstdname)ÚtimeÚtottimecóŠ—|d}tj||«}||_|ddD]}||j|<Œ||_|S©Nré)ÚstrÚ__new__Ú_value_Ú_value2member_map_Ú _all_values)ÚclsÚvaluesÚvalueÚobjÚ other_values ú/usr/lib64/python3.12/pstats.pyrzSortKey.__new__0sN€Ø�q‘ ˆÜ�k‰k˜#˜uÓ%ˆØˆŒ Ø! ! "›:ˆKØ25ˆC× "Ñ " ;Ò /ð&à ˆŒØˆ óN) Ú__name__Ú __module__Ú __qualname__ÚCALLSÚ CUMULATIVEÚFILENAMEÚLINEÚNAMEÚNFLÚPCALLSÚSTDNAMEÚTIMEr©r(r'r r $s4„à €EØ(€JØ#€HØ €DØ €DØ €CØ €FØ€GØ €Dór(r T)Ú unsafe_hashcóT—eZdZUeed<eed<eed<eed<eed<eed<eed<y) r rrÚpercall_tottimerÚpercall_cumtimeÚ file_nameÚ line_numberN)r)r*r+rÚ__annotations__ÚfloatÚintr5r(r'r r :s(…à ƒKØ ƒNØÓØ ƒNØÓ؃NØÔr(r có0—eZdZUdZeed<eeefed<y)r z0Class for keeping track of an item in inventory.Útotal_ttÚ func_profilesN) r)r*r+Ú__doc__r=r<rrr r5r(r'r r Ds…á:؃Oؘ˜_Ð,Ñ-Ô-r(r có¶—eZdZdZddœd„Zd„Zd„Zd„Zd„Zd „Z d d d d d d d dddddddœ Z d„Z d„Z d„Z d„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd#d „Zd!„Zd"„Zy)$raÛThis class is used for creating reports from data generated by the Profile class. It is a "friend" of that class, and imports data either by direct access to members of Profile class, or by reading in a dictionary that was emitted (via marshal) from the Profile class. The big change from the previous Profiler (in terms of raw functionality) is that an "add()" method has been provided to combine Stats from several distinct profile runs. Both the constructor and the add() method now take arbitrarily many file names as arguments. All the print methods now take an argument that indicates how many lines to print. If the arg is a floating-point number between 0 and 1.0, then it is taken as a decimal percentage of the available lines to be printed (e.g., .1 means print 10% of all available lines). If it is an integer, it is taken to mean the number of lines of data that you wish to have printed. The sort_stats() method now processes some additional options (i.e., in addition to the old -1, 0, 1, or 2 that are respectively interpreted as 'stdname', 'calls', 'time', and 'cumulative'). It takes either an arbitrary number of quoted strings or SortKey enum to select the sort order. For example sort_stats('time', 'name') or sort_stats(SortKey.TIME, SortKey.NAME) sorts on the major key of 'internal function time', and on the minor key of 'the name of the function'. Look at the two tables in sort_stats() and get_sort_arg_defs(self) for more examples. All methods return self, so you can string together commands like: Stats('foo', 'goo').strip_dirs().sort_stats('calls'). print_stats(5).print_callers(5) N)Ústreamcó¦—|xstj|_t|«sd}n |d}|dd}|j |«|j |Žyr)ÚsysÚstdoutrDÚlenÚinitÚadd)ÚselfrDÚargsÚargs r'Ú__init__zStats.__init__lsJ€ØÒ*¤§ ¡ ˆŒ Ü�4Œy؉Cà�q‘'ˆCؘ˜�8ˆDØ � ‰ �#ŒØˆ�‰�$Šr(cój—d|_g|_d|_d|_d|_d|_d|_t«|_i|_ i|_ |j|« |j«y#t$r7td|jr|jdndz|j¬«‚wxYw)NrzInvalid timing data %séÿÿÿÿÚ©Úfile)Ú all_calleesÚfilesÚfcn_listr@Ú total_callsÚ prim_callsÚ max_name_lenÚsetÚ top_levelÚstatsÚ sort_arg_dictÚ load_statsÚget_top_level_statsÚ ExceptionÚprintrD)rKrMs r'rIz Stats.initvs¨€ØˆÔ؈Œ ؈Œ ؈Œ ØˆÔØˆŒØˆÔÜ›ˆŒØˆŒ ØˆÔØ �‰˜Ôð Ø × $Ñ $Õ &øÜò Ü Ð*Ø%)§Z¢Z�4—:‘:˜b’>°Rñ9Ø?C¿{¹{õ Là ð ús Á!A2Á2AB2cóú—|€i|_yt|t«rst|d«5}t j |«|_ddd« t j|«}tj|j«dz|z}|g|_ n4t|d«r(|j«|j|_i|_|jstd|j›d|›�«‚y#1swYŒ©xYw#YŒuxYw)NÚrbz Ú create_statszCannot create or construct a z object from )r\Ú isinstancerÚopenÚmarshalÚloadÚosÚstatrÚctimeÚst_mtimerUÚhasattrrdÚ TypeErrorÚ __class__)rKrMÚfÚ file_statss r'r^zStats.load_stats‰sÓ€Ø ˆ;؈DŒJØ Ü ˜œSÔ !Ü�c˜4” AÜ$Ÿ\™\¨!›_�” ÷!ð ÜŸW™W S›\� Ü—j‘j ×!4Ñ!4Ó5¸Ñ>ÀÑD�ð˜ˆD�JÜ �S˜.Ô )Ø × Ñ Ô ØŸ™ˆDŒJ؈CŒIØ�zŠzÝØ#Ÿ~›~©sð4ó5ð 5à÷!�ûð  Ùús§C*Á :C6Ã*C3Ã6C:có†—|jj«D]¤\}\}}}}}|xj|z c_|xj|z c_|xj|z c_d|vr|j j |«tt|««|jkDsŒŒtt|««|_ Œ¦y)N)ÚjprofilerÚprofiler) r\ÚitemsrWrXr@r[rJrHÚfunc_std_stringrY)rKÚfuncÚccÚncÚttÚctÚcallerss r'r_zStats.get_top_level_statsŸs›€Ø/3¯z©z×/?Ñ/?Ö/AÑ +ˆDÑ+�2�r˜2˜r 7Ø × Ò  Ñ "Õ Ø �OŠO Ñ "�OØ �MŠM Ñ "�MØ*¨gÑ5Ø—‘×"Ñ" 4Ô(Ü”? 4Ó(Ó)¨D×,=Ñ,=Ó=Ü$'¬¸Ó(=Ó$>�Õ!ñ0Br(cóè—|s|St|«D�]^}t|«t|«k7r t|«}|xj|jz c_|xj|jz c_|xj |j z c_|xj |j z c_|jD]}|jj|«Œ|j|jkr|j|_ d|_ |jj«D]C\}}||jvr|j|}nddddif}t||«|j|<ŒE�Œa|S©Nr)ÚreversedÚtyperrUrWrXr@r[rJrYrVr\ruÚadd_func_stats)rKÚarg_listÚitemrwrjÚ old_func_stats r'rJz Stats.add©s+€Ù؈KܘX×&ˆDÜ�D‹zœT $›ZÒ'ܘT“{�Ø �JŠJ˜$Ÿ*™*Ñ $�JØ × Ò  × 0Ñ 0Ñ 0Õ Ø �OŠO˜tŸ™Ñ .�OØ �MŠM˜TŸ]™]Ñ *�MØŸœ�Ø—‘×"Ñ" 4Õ(ð'ð× Ñ  4×#4Ñ#4Ò4Ø$(×$5Ñ$5�Ô!à ˆDŒMà"Ÿj™j×.Ñ.Ö0‘ ��dؘ4Ÿ:™:Ñ%Ø$(§J¡J¨tÑ$4‘Mà%&¨¨1¨a°Ð$5�MÜ#1°-ÀÓ#F�— ‘ ˜4Ò ò 1ð'ð*ˆ r(có†—t|d«5}tj|j|«ddd«y#1swYyxYw)z:Write the profile data to a file we know how to load back.ÚwbN)rfrgÚdumpr\)rKrrps r'Ú dump_statszStats.dump_statsÃs,€ä �(˜DÔ ! QÜ �L‰L˜Ÿ™ QÔ '÷"× !Ñ !ús �!7·A)))rrPz call count)))érPzcumulative time))©érz file name))©érz line number))©érz function name))rŽrŠrŒzname/file/line)))rrPzprimitive call count)))érz standard name)))érPz internal time) r rrrrrrrrrrrrcóØ—|jsSix|_}i}|jj«D]!\}}|}|sŒ ||vrd||<Œ|||<|dd}|rŒŒ#|D]}||=Œ|jS)z)Expand all abbreviations that are unique.rNrP)r]Úsort_arg_dict_defaultru)rKÚdictÚbad_listÚwordÚtupÚfragments r'Úget_sort_arg_defszStats.get_sort_arg_defsÚs�€à×!Ò!Ø(*Ð *ˆDÔ  ØˆHØ!×7Ñ7×=Ñ=Ö?‘ ��cØ�ÚØ 4Ñ'Ø-.˜ Ñ*ØØ%(�D˜‘NØ'¨¨˜}�Hó ð@ó!�ؘ‘Jð!à×!Ñ!Ð!r(có —|s d|_|St|«dk(r"t|dt«rdddddœ|dg}n=t|«dk\r/|ddD]'}t |«t |d«k7sŒt d «‚|j «}d }d |_d }|D]I}t|t«r |j}|||dz}|xj|||dzz c_d }ŒKg}|jj«D]1\}\} } } } } |j| | | | f|zt|«|fz«Œ3|jtt!|«j"«¬ «gx|_}|D]}|j|d«Œ|S)Nrrrr rr)rPrrr‘r‘zCan't have mixed argument typer5rQz, )ÚkeyrP)rVrHrer>r€rnr™Ú sort_typer r$r\ruÚappendrvÚsortrÚ TupleCompÚcompare)rKÚfieldrMÚ sort_arg_defsÚ sort_tupleÚ connectorr–Ú stats_listrwrxryrzr{r|rVÚtuples r'Ú sort_statszStats.sort_statsësª€Ù؈DŒM؈KÜ ˆu‹:˜Š?œz¨%°©(´CÔ8à$Ø"Ø!Ø'ñ)ð*/¨q©ñ3ð5‰Eô�‹Z˜1Š_ؘQ˜R“y�ܘ“9¤ U¨1¡X£Ó.Ü#Ð$DÓEÐEð!ð×.Ñ.Ó0ˆ àˆ ØˆŒØˆ ÛˆDܘ$¤Ô(Ø—z‘z�Ø# m°DÑ&9¸!Ñ&<Ñ<ˆJØ �NŠN˜i¨-¸Ñ*=¸aÑ*@Ñ@Ñ @�N؉Ið ðˆ Ø/3¯z©z×/?Ñ/?Ö/AÑ +ˆDÑ+�2�r˜2˜r 7Ø × Ñ ˜r 2 r¨2Ð.°Ñ5Ü.¨tÓ4°dÐ;ñ<õ =ð0Bð �‰œJ¤y°Ó'<×'DÑ'DÓEˆÔFà#%Ð%ˆŒ ˜ÛˆEØ �O‰O˜E "™IÕ &ð àˆ r(cóR—|jr|jj«|S©N)rVÚreverse©rKs r'Ú reverse_orderzStats.reverse_orders€Ø �=Š=Ø �M‰M× !Ñ !Ô #؈ r(c ó—|j}ix|_}d}|j«D]�\}\}}}}} t|«} tt | ««|kDrtt | ««}i} | j«D]\} } | | t| «<Œ| |vrt || ||||| f«|| <Œ†||||| f|| <Œ‘|j }t«x|_}|D]}|jt|««Œ||_ d|_ d|_ |Sr~) r\ruÚfunc_strip_pathrHrvr�r[rZrJrYrVrT)rKÚoldstatsÚnewstatsrYrwrxryrzr{r|ÚnewfuncÚ newcallersÚfunc2ÚcallerÚold_topÚnew_tops r'Ú strip_dirszStats.strip_dirss*€Ø—:‘:ˆØ "Ð"ˆŒ �X؈ Ø/7¯~©~Ö/?Ñ +ˆDÑ+�2�r˜2˜r 7Ü% dÓ+ˆGÜ”? 7Ó+Ó,¨|Ò;Ü"¤?°7Ó#;Ó<� ؈JØ!(§¡¦‘ ��vØ5;� œ?¨5Ó1Ò2ð"1ð˜(Ñ"Ü$2Ø(0°Ñ(9Ø)+¨R°°R¸Ð(Dó%F�˜Ò!ð&(¨¨R°°ZÐ$@�˜Ò!ð0@ð—.‘.ˆÜ#&£5Ð(ˆŒ˜ÛˆDØ �K‰Kœ¨Ó-Õ .ðð)ˆÔàˆŒ ØˆÔØˆ r(cóä—|jryix|_}|jj«D]=\}\}}}}}||vri||<|j«D]\}} ||vri||<| |||<ŒŒ?yr©)rTr\ru) rKrTrwrxryrzr{r|r³r´s r'Ú calc_calleeszStats.calc_callees4s�€Ø × Ò Ø Ø)+Ð+ˆÔ˜;Ø/3¯z©z×/?Ñ/?Ö/AÑ +ˆDÑ+�2�r˜2˜r 7ؘ;Ñ&Ø$&� ˜DÑ!Ø!(§¡¦‘ ��vØ  Ñ+Ø)+�K Ñ&Ø,2� ˜EÑ" 4Ò(ñ"1ð0Bð r(cóJ—|}t|t«rL tj|«}g}|D].}|j t |««sŒ|j|«Œ0net|«}t|t«r%d|cxkrdkrnnt||zdz«}|d|}n%t|t«rd|cxkr|kr nn|}|d|}t|«t|«k7r!|dt|«›dt|«›d|›d �z }||fS#tj$r|d|zz }||fcYSwxYw) Nz# ggð?gà?rz List reduced from z to z due to restriction ) rerÚreÚcompileÚerrorÚsearchrvr�rHr=r>)rKÚselÚlistÚmsgÚnew_listÚrexrwÚcounts r'Úeval_print_amountzStats.eval_print_amountGs€ØˆÜ �cœ3Ô ð %Ü—j‘j “o�ðˆHÛ�Ø—:‘:œo¨dÓ3Õ4Ø—O‘O DÕ)ñô˜“IˆEܘ#œuÔ%¨#°Ô*:°sÕ*:ܘE C™K¨"Ñ,Ó-�Ø  ˜<‘ܘC¤Ô%¨!¨sÔ*:°UÕ*:Ø�Ø  ˜<�Ü ˆt‹9œ˜H› Ò %Ù Ü�D• œ3˜x�=ª#ð/ñ /ˆCð˜ˆ}Ðøô'—8‘8ò %ØÐ=ÀÑCÑC�Ø �}Ò$ð %ús”DÄD"Ä!D"c ó‚—|jr|jddn"t|jj««}|s t di«St t |j««}i}t ||«}|D]Á}|j|\}}}} } |\} } } ||k(r t|«nt|«dzt|«z}t t |««}|dk(rdnt t ||z ««}t t | ««}|dk(rdnt t | |z ««}t|||||| | «}||| <ŒÃ|S)a?This method returns an instance of StatsProfile, which contains a mapping of function names to instances of FunctionProfile. Each FunctionProfile instance holds information related to the function's profile such as how long the function took to run, how many times it was called, etc... NrÚ/rP) rVrÀr\Úkeysr r=Úf8r@rr )rKÚ func_listr@rAÚ stats_profilerwrxryrzr{r|r:r;Ú func_namerrr8rr9Ú func_profiles r'Úget_stats_profilezStats.get_stats_profileas0€ð )-¯ ª �D—M‘M¡!Ñ$¼4ÀÇ Á ÇÁÓ@QÓ;Rˆ ÙÜ  2Ó&Ð &䜘DŸM™MÓ*Ó+ˆØˆ Ü$ X¨}Ó=ˆ ãˆDØ&*§j¡j°Ñ&6Ñ #ˆB��B˜˜GØ04Ñ -ˆI�{ IØ " b¢”S˜”W¬s°2«w¸©}¼sÀ2»wÑ/FˆFÜœB˜r›F“mˆGØ$&¨!¢G™b´´r¸"¸R¹%³yÓ1AˆOÜœB˜r›F“mˆGØ$&¨!¢G™b´´r¸"¸R¹%³yÓ1AˆOÜ*ØØØØØØØóˆLð(4ˆM˜)Ò $ð#ð&Ðr(cóò—|j}|jr"|jdd}d|jzdz}n%t|jj ««}d}|D]}|j |||«\}}Œt|«}|sd|fSt||j¬«|t|j«kr5d}|D].}tt|««|kDsŒtt|««}Œ0|dz|fS)Nz Ordered by: Ú z! Random listing order was used rrRr‘) rYrVrœrÀr\rÈrÅrHrarDrv)rKÚsel_listÚwidthÚ stat_listrÁÚ selectionrÄrws r'Úget_print_listzStats.get_print_list„sè€Ø×!Ñ!ˆØ �=Š=ØŸ ™ ¡aÐ(ˆIØ# d§n¡nÑ4°tÑ;‰Cä˜TŸZ™ZŸ_™_Ó.Ó/ˆIØ6ˆCã!ˆIØ!×3Ñ3°I¸yÈ#ÓN‰NˆI‘sð"ô�I“ˆáØ�i�<Ð Ü ˆc˜Ÿ ™ Õ$Ø ”3�t—z‘z“?Ò "؈EÛ!�Üœ¨Ó-Ó.°Ó6ܤ°Ó 5Ó6‘Eð"ð�Q‰w˜ Ð!Ð!r(có—|jD]}t||j¬«Œ|jrt|j¬«d}|jD]#}t|t |«|j¬«Œ%t||j dd|j¬«|j |j k7r%td|j zd|j¬«td|jz|j¬«t|j¬«|j|«\}}|rT|j«|D]}|j|«Œt|j¬«t|j¬«|S)NrRú zfunction callsÚ ©ÚendrSz(%d primitive calls)zin %.3f seconds) rUrarDr[Úfunc_get_function_namerWrXr@rÕÚ print_titleÚ print_line)rKÚamountrÚindentrwrÒrÀs r'Ú print_statszStats.print_statsœs€ØŸ œ ˆHÜ �( §¡Ö -ð#à �:Š:Ü �t—{‘{Õ #؈ؗN”NˆDÜ �&Ô0°Ó6¸T¿[¹[Ö Ið#ô ˆf�d×&Ñ&Ð(8¸cÈÏ É ÕTØ × Ñ ˜tŸ™Ò .Ü Ð(¨4¯?©?Ñ:ÀÈ$Ï+É+Õ VÜ Ð $§-¡-Ñ/°d·k±kÕBÜ �4—;‘;ÕØ×)Ñ)¨&Ó1‰ ˆˆtÙ Ø × Ñ Ô Û�Ø—‘ Õ%ðä �t—{‘{Õ #Ü �t—{‘{Õ #؈ r(có`—|j|«\}}|r—|j«|j|d«|D]D}||jvr!|j |||j|«Œ2|j ||i«ŒFt |j ¬«t |j ¬«|S)Nz called...rR)rÕr¹Úprint_call_headingrTÚprint_call_linerarD)rKrÞrÒrÀrws r'Ú print_calleeszStats.print_callees³s›€Ø×)Ñ)¨&Ó1‰ ˆˆtÙ Ø × Ñ Ô à × #Ñ # E¨;Ô 7Û�ؘ4×+Ñ+Ñ+Ø×(Ñ(¨°°d×6FÑ6FÀtÑ6LÕMà×(Ñ(¨°°bÕ9ð ô �t—{‘{Õ #Ü �t—{‘{Õ #؈ r(có—|j|«\}}|rn|j|d«|D]+}|j|\}}}}} |j||| d«Œ-t |j ¬«t |j ¬«|S)Nzwas called by...z<-rR)rÕrâr\rãrarD) rKrÞrÒrÀrwrxryrzr{r|s r'Ú print_callerszStats.print_callersÂs€€Ø×)Ñ)¨&Ó1‰ ˆˆtÙ Ø × #Ñ # EÐ+=Ô >Û�Ø*.¯*©*°TÑ*:Ñ'��B˜˜B Ø×$Ñ$ U¨D°'¸4Õ@ðô �t—{‘{Õ #Ü �t—{‘{Õ #؈ r(cóP—tdj|«|z|j¬«d}|jj «D]>\}}}}}|sŒ t t |j «««} t| t«}n|rtd|zdz|j¬«yy)Nz Function rRFrØz ncalls tottime cumtime) raÚljustrDr\r#ÚnextÚiterrer¦) rKÚ name_sizeÚ column_titleÚ subheaderrxryrzr{r|r$s r'râzStats.print_call_headingÍs‘€Ü ˆk×Ñ  Ó*¨\Ñ9ÀÇ Á ÕLàˆ Ø'+§z¡z×'8Ñ'8Ö':Ñ #ˆB��B˜˜GÚÜœT '§.¡.Ó"2Ó3Ó4�Ü& u¬eÓ4� Ùð (;ñ Ü �#�i‘-Ð"@Ñ@ÀtÇ{Á{Ö Sð r(c óh—tt|«j|«|zd|j¬«|st|j¬«yt |j ««}d}|D]Æ}t|«}||} t | t«r]| \} } } } | | k7rd| | fz}nd| fz}|jddt|«zz«›dt| «›dt| «›d |›�}|d z}n(|›d | ›d t|j|d «›�}|d z}t||z|z|j¬«d}ŒÈy)NrØrÙrRrQz%d/%dz%dr�r‘z rÚ(z) r‰) rarvrèrDÚsortedrÈrer¦ÚrjustrHrÉr\)rKrëÚsourceÚ call_dictÚarrowÚclistrßrwrr$ryrxrzr{ÚsubstatsÚ left_widths r'rãzStats.print_call_lineÙs €Ü Œo˜fÓ%×+Ñ+¨IÓ6¸Ñ>ÀCÈdÏkÉkÕZÙÜ �t—{‘{Õ #Ø Ü�y—~‘~Ó'Ó(ˆØˆÛˆDÜ" 4Ó(ˆDؘd‘OˆEܘ%¤Ô'Ø!&‘��B˜˜Bؘ’8Ø&¨"¨b¨Ñ1‘Hà# r e™|�HØ-5¯^©^¸A¸aÄÀFà ¹m¹OÕ-LÜ-/°­V´R¸µV¹TðC�à&¨™]‘ â*.²´r¸$¿*¹*ÀTÑ:JÈ1Ñ:MÔ7NÐO�Ø&¨™]� Ü �&˜Ñ# hÑ.°T·[±[Õ A؉Fñ!r(cób—tdd|j¬«td|j¬«y)Nz- ncalls tottime percall cumtime percallrØrÙzfilename:lineno(function)rR©rarDr«s r'rÜzStats.print_titleòs"€Ü Ð=À3ÈTÏ[É[ÕYÜ Ð)°· ± Ö)r)r*r+rBrNrIr^r_rJrˆr“r™r§r¬r·r¹rÅrÎrÕràrärærârãrÜrÝr5r(r'rrJs«„ñðB&*ôòò&ò,?òò4(ðDØCØHØHØBØDØBØFØGØMØFØFØFñÐò "ò"%òNò ò: ò&ò4!òF"ò0ò. ò ò Tóò2=ó7r(rcó—eZdZdZd„Zd„Zy)rŸa–This class provides a generic function for comparing any two tuples. Each instance records a list of tuple-indices (from most significant to least significant), and sort direction (ascending or descending) for each tuple-index. The compare functions can then be used as the function argument to the system sort() function when a list of tuples need to be sorted in the instances order.có—||_yr©©Úcomp_select_list)rKrs r'rNzTupleComp.__init__s €Ø 0ˆÕr(cóf—|jD]"\}}||}||}||kr| cS||kDsŒ |cSyr~rÿ)rKÚleftÚrightÚindexÚ directionÚlÚrs r'r zTupleComp.comparesJ€Ø $× 5Ô 5Ñ ˆE�9Ø�U‘ ˆAØ�e‘ ˆAØ�1ŠuØ!�zÒ!Ø�1‹uØ Ò ð !6ðr(N)r)r*r+rBrNr r5r(r'rŸrŸs„ñ&ò1ór(rŸcóR—|\}}}tjj|«||fSr©)riÚpathÚbasename)rÌrrrs r'r®r®!s*€Ø$Ñ€Hˆd�DÜ �7‰7× Ñ ˜HÓ % t¨TÐ 1Ð1r(có —|dS)Nr‘r5)rws r'rÛrÛ%s €Ø �‰7€Nr(có~—|dddk(r1|d}|jd«r|jd«rd|ddzS|Sd|zS) Nr‘)Ú~rÚ<Ú>z{%s}rrPz %s:%d(%s))Ú startswithÚendswith)rÌrs r'rvrv(sQ€Ø��!€}˜Ò à˜‰|ˆØ �?‰?˜3Ô  D§M¡M°#Ô$6ؘD  2˜JÑ&Ð &àˆKà˜YÑ&Ð&r(có\—|\}}}}}|\}}} } } ||z||z|| z|| zt| |«fS)z3Add together all the stats for two profile entries.)Ú add_callers) Útargetròrxryrzr{r|Út_ccÚt_ncÚt_ttÚt_ctÚ t_callerss r'r�r�9sO€à$Ñ€BˆˆB��GØ(.Ñ%€Dˆ$��d˜IØ ˆt‰G�R˜‘W˜b ™g r¨$¡wܘ) WÓ-ð /ð/r(c ó—i}|j«D] \}}|||<Œ |j«D]O\}}||vrAt|t«r#td„t|||«D««||<Œ=||xx|z cc<ŒK|||<ŒQ|S)z*Combine two caller lists in a single list.c3ó,K—|] \}}||z–—Œy­wr©r5)Ú.0ÚiÚjs r'Ú zadd_callers..Isèø€Ð)[Ñ—d}|j«D]}||z }Œ |S)z@Sum the caller statistics to get total number of calls received.r)r#)r|ryr s r'Ú count_callsr#Qs&€à €BØ—‘Ö!ˆØ ˆe‰ ‰ð"à €Ir(có —d|zS)Nz%8.3fr5)Úxs r'rÉrÉ\s €Ø �Q‰;Ðr(Ú__main__cóª—eZdZdd„Zd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zy)ÚProfileBrowserNcó°—tjj|«d|_d|_t j |_|�|j|«yy)Nú% ) ÚcmdÚCmdrNÚpromptr\rFrGrDÚdo_read)rKÚprofiles r'rNzProfileBrowser.__init__ksD€Ü �G‰G× Ñ ˜TÔ "؈DŒK؈DŒJÜŸ*™*ˆDŒKØÐ"Ø— ‘ ˜WÕ%ð#r(cóÆ—|j«}g}|D]} |jt|««Œ|jrt|j|«|Žyt d|j ¬«y#t$rYnwxYw t |«}|dkDs|dkrt d|j ¬«Œ›|j|«Œ­#t$rYnwxYw|j|«ŒÎ)Nrrz#Fraction argument must be in [0, 1]rRúNo statistics object is loaded.) Úsplitr�r>Ú ValueErrorr=rarDr\Úgetattr)rKÚfnrrLÚ processedÚtermÚfracs r'ÚgenericzProfileBrowser.genericss߀Ø—:‘:“<ˆD؈IÛ�ðØ×$Ñ$¤S¨£YÔ/Øðð �zŠzØ'”˜Ÿ ™  BÓ'¨Ñ3ðôÐ7¸d¿k¹kÕJØøô!"òÙðúðÜ  ›;�Dؘa’x 4¨!¢8ÜÐCÈ$Ï+É+ÕVØ Ø×$Ñ$ TÔ*ØøÜ!òÙðúà× Ñ  Õ&s)™A3Á3 A?Á>A?Â,CÂ0Cà Cà Ccó—td|j¬«td|j¬«td|j¬«td|j¬«td|j¬«td|j¬«y)NzArguments may be:rRz0* An integer maximum number of entries to print.z:* A decimal fractional number between 0 and 1, controllingz- what fraction of selected entries to print.z8* A regular expression; only entries with function namesz that match it are printed.rùr«s r'Ú generic_helpzProfileBrowser.generic_help‹sb€Ü Ð%¨D¯K©KÕ 8Ü ÐDÈ4Ï;É;Õ WÜ ÐNÐUY×U`ÑU`Õ aÜ ÐAÈÏ É Õ TÜ ÐLÐSW×S^ÑS^Õ _Ü Ð0°t·{±{Ö Cr(cóê—|jr |jj|«ytd|j¬«y#t$r'}td|›d|›�|j¬«Yd}~yd}~wwxYw)NzFailed to load statistics for z: rRr1r)r\rJÚOSErrorrarD)rKrÚes r'Údo_addzProfileBrowser.do_add“sj€Ø�zŠzð`Ø—J‘J—N‘N 4Ô(ð ôÐ7¸d¿k¹kÕJØøô ò`ÝÂDÉ!ÐLÐSW×S^ÑS^×_Ñ_ðûð `úsŽAÁ A2Á A-Á-A2có2—td|j¬«y)Nz>Add profile info from given file to current statistics object.rRrùr«s r'Úhelp_addzProfileBrowser.help_addœs€Ü ÐRÐY]×YdÑYdÖ er(có&—|jd|«S)Nrä©r9©rKrs r'Ú do_calleeszProfileBrowser.do_calleesŸó€Ø—<‘< °Ó6Ð 6r(cóR—td|j¬«|j«y)Nz6Print callees statistics from the current stat object.rR©rarDr;r«s r'Ú help_calleeszProfileBrowser.help_callees¡ó €Ü ÐJÐQU×Q\ÑQ\Õ ]Ø × Ñ Õ r(có&—|jd|«S)NrærCrDs r'Ú do_callerszProfileBrowser.do_callers¥rFr(cóR—td|j¬«|j«y)Nz6Print callers statistics from the current stat object.rRrHr«s r'Ú help_callerszProfileBrowser.help_callers§rJr(có2—td|j¬«y)NrQrRrrùrDs r'Údo_EOFzProfileBrowser.do_EOF«s€Ü �"˜4Ÿ;™;Õ 'Ør(có2—td|j¬«y©NzLeave the profile browser.rRrùr«s r'Úhelp_EOFzProfileBrowser.help_EOF®ó€Ü Ð.°T·[±[Ö Ar(có—y)Nrr5rDs r'Údo_quitzProfileBrowser.do_quit±s€Ør(có2—td|j¬«yrRrùr«s r'Ú help_quitzProfileBrowser.help_quit³rTr(cóÔ—|r t|«|_|dz|_ yt|j«dkDr!|jdd}|j|«ytd|j ¬«y#t$r.}t|jd|j ¬«Yd}~yd}~wt $r9}t|jjdz||j ¬«Yd}~yd}~wwxYw) NrrRÚ:r*r‘éþÿÿÿz1No statistics object is current -- cannot reload.r) rr\r=rarLrDr`ror)r-rHr.)rKrÚerrs r'r.zProfileBrowser.do_read¶sÈ€ÙðÜ!& t£�D”Jð# T™k�” ð ô �T—[‘[Ó! AÒ%Ø—{‘{ 3 BÐ'�Ø— ‘ ˜TÔ"ðôÐIÐPT×P[ÑP[Õ\Øøôòܘ#Ÿ(™( 1™+¨D¯K©KÕ8ÜûÜ òܘ#Ÿ-™-×0Ñ0°3Ñ6¸À$Ç+Á+ÕNÜûðús#„A0Á0 C'Á9$B"Â" C'Â./C"Ã"C'có`—td|j¬«td|j¬«y)Nz+Read in profile data from a specified file.rRz*Without argument, reload the current file.rùr«s r'Ú help_readzProfileBrowser.help_readÇs €Ü Ð?ÀdÇkÁkÕ RÜ Ð>ÀTÇ[Á[Ö Qr(có€—|jr|jj«ytd|j¬«y)Nr1rRr)r\r¬rarDrDs r'Ú do_reversezProfileBrowser.do_reverseËs2€Ø�zŠzØ— ‘ ×(Ñ(Ô*ðôÐ7¸d¿k¹kÕJØr(có2—td|j¬«y)Nz/Reverse the sort order of the profiling report.rRrùr«s r'Ú help_reversezProfileBrowser.help_reverseÑs€Ü ÐCÈ$Ï+É+Ö Vr(cóÒ‡—|jstd|j¬«y|jj«Š|rJt ˆfd„|j «D««r(|jj |j «Žytd|j¬«tjj«D]$\}}t|›d|d›�|j¬«Œ&y)Nr1rRc3ó&•K—|]}|‰v–—Œ y­wr©r5)rr%Úabbrevss €r'rz)ProfileBrowser.do_sort..Ùsøèø€ÐA±L¨q˜Q 'œ\±Lùsƒz/Valid sort keys (unique prefixes are accepted):z -- rr) r\rarDr™Úallr2r§rr“ru)rKrr›r$res @r'Údo_sortzProfileBrowser.do_sortÔs¬ø€Ø—:’:ÜÐ7¸d¿k¹kÕJØØ—j‘j×2Ñ2Ó4ˆGÙœÓA°D·J±J´LÓAÔAØ%�— ‘ ×%Ñ% t§z¡z£|Ñ4ð ôÐGÈdÏkÉkÕZÜ$)×$?Ñ$?×$EÑ$EÖ$G‘L�S˜%ܪ¨U°1ªXÐ6¸T¿[¹[ÖIð%Hàr(có`—td|j¬«td|j¬«y)Nz.Sort profile data according to specified keys.rRz3(Typing `sort' without arguments lists valid keys.)rùr«s r'Ú help_sortzProfileBrowser.help_sortàs €Ü ÐBÈÏÉÕ UÜ ÐGÈdÏkÉkÖ Zr(cól—tjD�cgc]}|j|«sŒ|‘Œc}Scc}wr©)rr“r)rKÚtextrLÚas r'Ú complete_sortzProfileBrowser.complete_sortãs-€Ü$×:Ò:ÓQÑ:˜!¸a¿l¹lÈ4Õ>P’AÐ:ÑQÐ QùÒQs“1ª1có&—|jd|«S)NràrCrDs r'Údo_statszProfileBrowser.do_statsæs€Ø—<‘<  ¨tÓ4Ð 4r(cóR—td|j¬«|j«y)Nz.Print statistics from the current stat object.rRrHr«s r'Ú help_statszProfileBrowser.help_statsès€Ü ÐBÈÏÉÕ UØ × Ñ Õ r(có€—|jr|jj«ytd|j¬«y)Nr1rR)r\r·rarDrDs r'Údo_stripzProfileBrowser.do_stripìs(€Ø�zŠzØ— ‘ ×%Ñ%Õ'äÐ7¸d¿k¹kÖJr(có2—td|j¬«y)Nzr‡sŒðÙ9ó, Û Û ÛÛ ç&Ý Ý!Ýâ A€á ˆgÓ÷ðóðñ* �tÔ÷ðóðñ �tÔ÷.ð.óð.÷ |7ñ|7÷| ñò22òò 'ò"/òò"òð ˆzÒÛð ÛôP˜Ÿ™ôPñd ˆ3�8‰8ƒ}�qÒØ—h‘h˜q‘k‰ àˆ ð Ù  Ó-ˆØ—x‘x  “|ˆGØ �N‰N˜7Õ #ð$á Ð:ÀÇÁÕPØ�‰ÔÙ ˆj˜wŸ~™~Ö.ðGøð ò Ù ð ûð@ ò Ù ð ús%Â)EÃ*A%EÅEÅEÅE$Å#E$