Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

'MAKE_CLOSURE', 'LOAD_CLOSURE', 'LOAD_DEREF', 'STORE_DEREF',

'CALL_FUNCTION_VAR', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_VAR_KW',

'EXTENDED_ARG']

Π›Π΅Π³ΠΊΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ LOAD ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ значСния Π² стСк, STORE β€” Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ, PRINT β€” ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, BINARY β€” Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈ Ρ‚.ΠΏ.

ΠžΡ‚Π»Π°Π΄ΠΊΠ°

Π’ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ языка Python Π·Π°Π»ΠΎΠΆΠ΅Π½Ρ‹ возмоТности ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π° Π² стандартной поставкС имССтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ β€” pdb. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая подвСргаСтся ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ сСссию ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

# File myfun.py

def fun(s):

 lst = []

 for i in s:

  lst.append(ord(i))

 return lst

Π’Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ процСсс ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

>>> import pdb, myfun

>>> pdb.runcall(myfun.fun, Β«ABCDEΒ»)

> /examples/myfun.py(4)fun()

-> lst = []

(Pdb) n

> /examples/myfun.py(5)fun()

-> for i in s:

(Pdb) n

> /examples/myfun.py(6)fun()

-> lst.append(ord(i))

(Pdb) l

1   #!/usr/bin/python

2   # File myfun.py

3   def fun(s):

4    lst = []

5    for i in s:

6 ->  lst.append(ord(i))

7    return lst

[EOF]

(Pdb) p lst

[]

(Pdb) p vars()

{'i': 'A', 's': 'ABCDE', 'lst': []}

(Pdb) n

> /examples/myfun.py(5)fun()

-> for i in s:

(Pdb) p vars()

{'i': 'A', 's': 'ABCDE', 'lst': [65]}

(Pdb) n

> /examples/myfun.py(6)fun()

-> lst.append(ord(i))

(Pdb) n

> /examples/myfun.py(5)fun()

-> for i in s:

(Pdb) p vars()

{'i': 'B', 's': 'ABCDE', 'lst': [65, 66]}

(Pdb) r

- Return -

> /examples/myfun.py(7)fun() β€” >[65, 66, 67, 68, 69]

-> return lst

(Pdb) n

[65, 66, 67, 68, 69]

>>>

Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ вызываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pdb.runcall() ΠΈ Π½Π° Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ (Pdb) слСдуСт Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСссии ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄: l (ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ трассируСмого ΠΊΠΎΠ΄Π°), n (Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки), s (ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠ³Π»ΡƒΠ±ΠΈΠ²ΡˆΠΈΡΡŒ Π² Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), p (ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ значСния), r (Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС Π΄ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).

РазумССтся, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° для Python ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ достаточно Π»Π΅Π³ΠΊΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, поставив Π² ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… мСстах ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ print для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этого достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π’ CGI–сцСнариях ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ cgitb, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π»Π΅ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€

Для опрСдСлСния мСст Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ profile

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ позволяСт ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²Ρ‹Π΄Π°Ρ‚ΡŒ статистику использования процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ части Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для поиска строк ΠΈΠ· списка, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π½Π° Π΄Π°Π½Π½ΡƒΡŽ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ качСствСнно ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ difflib.get_close_matches(), Π½ΡƒΠΆΠ΅Π½ большой объСм Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Ρ„Π°ΠΉΠ»Π΅ russian.txt собрано 160 тысяч слов русского языка. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ difflib.get_close_matches():

import difflib, profile


def print_close_matches(word):

 print "\n".join(difflib.get_close_matches(word + "\n", open("russian.txt")))


profile.run(r'print_close_matches("ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€")')

ΠŸΡ€ΠΈ запускС этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€


Ρ‚Ρ€Π°ΠΉΠ»Π΅Ρ€


Π±Ρ€ΠΎΠΉΠ»Π΅Ρ€


899769 function calls (877642 primitive calls) in 23.620 CPU seconds


Ordered by: standard name


    ncalls tottime percall cumtime percall filename:lineno(function)

         1   0.000   0.000  23.610  23.610 <string>:1(?)

         1   0.000   0.000  23.610  23.610 T.py:6(print_close_matches)

         1   0.000   0.000   0.000   0.000 difflib.py:147(__init__)

         1   0.000   0.000   0.000   0.000 difflib.py:210(set_seqs)

    159443   1.420   0.000   1.420   0.000 difflib.py:222(set_seq1)

         2   0.000   0.000   0.000   0.000 difflib.py:248(set_seq2)

         2   0.000   0.000   0.000   0.000 difflib.py:293(__chain_b)

    324261   2.240   0.000   2.240   0.000 difflib.py:32(_calculate_ratio)

     28317   1.590   0.000   1.590   0.000 difflib.py:344(find_longest_match)

      6474   0.100   0.000   2.690   0.000 difflib.py:454(get_matching_blocks)

28317/6190   1.000   0.000   2.590   0.000 difflib.py:480(__helper)

      6474   0.450   0.000   3.480   0.001 difflib.py:595(ratio)

     28686   0.240   0.000   0.240   0.000 difflib.py:617(<lambda>)

    158345   8.690   0.000   9.760   0.000 difflib.py:621(quick_ratio)

    159442   2.950   0.000   4.020   0.000 difflib.py:650(real_quick_ratio)

         1   4.930   4.930  23.610  23.610 difflib.py:662(get_close_matches)

         1   0.010   0.010  23.620  23.620 profile:0(print_close_matches("ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€"))

         0   0.000   0.000                 profile:0(profiler)

Π—Π΄Π΅ΡΡŒ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния: ncalls β€” количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), tottime β€” врСмя выполнСния ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), percall β€” Ρ‚ΠΎ ΠΆΠ΅ врСмя, Π² пСрСсчСтС Π½Π° ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ², cumtime β€” суммарноС врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΈ всСх Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), filename β€” имя Ρ„Π°ΠΉΠ»Π°, lineno β€” Π½ΠΎΠΌΠ΅Ρ€ строки Π² Ρ„Π°ΠΉΠ»Π΅, function β€” имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ссли эти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ извСстны).

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ статистики слСдуСт, Ρ‡Ρ‚ΠΎ наибольшиС усилия ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² функциях quick_ratio() (Π½Π° Π½Π΅Π΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ 8,69 сСкунд), get_close_matches() (4,93 сСкунд), Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π½ΡΡ‚ΡŒΡΡ real_quick_ratio() (2,95 сСкунд) ΠΈ _calculate_ratio() (сСкунд).

Π­Ρ‚ΠΎ лишь самый простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€Π°: ΠΌΠΎΠ΄ΡƒΠ»ΡŒ profile (ΠΈ связанный с Π½ΠΈΠΌ pstats) позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ статистику: ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ timeit

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ проводится оптимизация нСбольшого участка ΠΊΠΎΠ΄Π°. НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстрым. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля timeit.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ timeit() для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для вычислСния нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°. Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡ проводятся для Ρ‚Ρ€Π΅Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°, Π΄Π΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅: ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΄Π΅ΡΡΡ‚ΡŒ тысяч строк Π² ΠΎΠ΄Π½Ρƒ строку. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ СстСствСнный, Β«Π»ΠΎΠ±ΠΎΠ²ΠΎΠΉΒ» ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠ΅ строк Π² спискС с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ объСдинСниСм Π² ΠΎΠ΄Π½Ρƒ строку, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ примСняСтся списковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ объСдинСниС элСмСнтов списка Π² ΠΎΠ΄Π½Ρƒ строку:

from timeit import Timer


t = Timer("""

res = ""

for k in range(1000000,1010000):

 res += str(k)

""")

print t.timeit(200)


t = Timer("""

res = []

for k in range(1000000,1010000):

 res.append(str(k))

res = ",".join(res)

""")

print t.timeit(200)


t = Timer("""

res = ",".join([str(k) for k in range(1000000,1010000)])

""")

print t.timeit(200)

Π Π°Π·Π½Ρ‹Π΅ вСрсии Python Π΄Π°Π΄ΡƒΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ²:

# Python 2.3

77.6665899754

10.1372740269

9.07727599144


# Python 2.4

9.26631307602

9.8416929245

7.36629199982

Π’ старых вСрсиях Python Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΌ способом ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ большого количСства строк являлось Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈΡ… Π² спискС с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ join() (кстати, инкрСмСнтная конкатСнация ΠΏΠΎΡ‡Ρ‚ΠΈ Π² восСмь Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ этого ΠΏΡ€ΠΈΠ΅ΠΌΠ°). Начиная с вСрсии 2.4, инкрСмСнтная конкатСнация Π±Ρ‹Π»Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Ρ‡Π΅ΠΌ вСрсия со списками (которая Π²Π΄ΠΎΠ±Π°Π²ΠΎΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС памяти). Но Ρ‡Π΅ΠΌΠΏΠΈΠΎΠ½ΠΎΠΌ всС–таки являСтся Ρ€Π°Π±ΠΎΡ‚Π° со списковым Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, поэтому свСртываниС Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² списковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ позволяСт ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.

Если Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ repeat(n, k) β€” ΠΎΠ½ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ timeit(k) n Ρ€Π°Π·, возвращая список ΠΈΠ· n Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ проводятся испытания.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ

Основная рСализация языка Python ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ компилятора, поэтому Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΎΠ± ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° самим программистом. Π’ любом языкС программирования ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ свои Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ (ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅) ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Π΄Π²ΡƒΡ… (Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ…) направлСниях: ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ занимаСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ условиях достатка ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти прилоТСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎ скорости. ΠŸΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ вычислСния слСдуСт ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Ρ‰Π΅Π΅ врСмя Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ ΠΈ врСмя Π΅Π΅ написания. НС стоит Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ усилия Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ссли ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ.