Скрипты времени Python с использованием IPython magic
Как я могу рассчитать время выполнения скрипта Python, используя магические команды iPython %time или %%timeit? Например, у меня есть script.py, и я хотел бы знать, сколько времени требуется для его выполнения. Небольшой нюанс: script.py нуждается во входных параметрах. Ниже, кажется, не работает.
%%time script.py input_param1 input_param2
2 ответа
Решение
Вы можете использовать:
%%timeit
%run script.py input_param1 input_param2
Имейте в виду, что сценарий будет выполняться несколько раз (число является адаптивным). Чтобы выполнить его только один раз (и с менее точным временем), измените первую строку на
%%timeit -n1 -r1
объяснение
Все магические команды начинаются с %%
применить ко всей клетке. Особенно %%timeit
будет время всех строк в ячейке.
IPython позволяет использовать магические команды (одиночные %
) в любой точке вашего кода (т.е. циклы, если-тогда). Здесь мы просто используем магическую команду %run
запустить скрипт.
Смотрите также: Волшебные функции из официальных документов IPython.
Вы также можете попробовать cProfile
это стандартный встроенный профилировщик Python, который рекомендуется для большинства пользователей.
Он дает общее время выполнения в дополнение к общему времени выполнения каждой функции и количество вызовов каждой функции.
Вот пример того, как использовать его при запуске вашего скрипта. Результаты сохраняются в файл с именем 'output_stats':
import cProfile
import pstats
cProfile.run(open('primes.py', 'rb'), 'output_stats')
p = pstats.Stats('output_stats')
p.sort_stats('cumulative').print_stats(10)
Thu May 14 09:26:09 2015 output_stats
369 function calls in 0.213 seconds
Ordered by: cumulative time
List reduced from 89 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.213 0.213 primes.py:1(<module>)
1 0.019 0.019 0.213 0.213 primes.py:22(prime)
2 0.141 0.070 0.181 0.091 primes.py:1(primes)
3 0.041 0.014 0.041 0.014 {range}
4 0.000 0.000 0.013 0.003 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/iostream.py:207(write)
1 0.000 0.000 0.010 0.010 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/iostream.py:151(flush)
1 0.000 0.000 0.010 0.010 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:589(send)
1 0.000 0.000 0.009 0.009 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:530(serialize)
4 0.000 0.000 0.007 0.002 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/IPython/kernel/zmq/session.py:84(<lambda>)
4 0.000 0.000 0.007 0.002 /usr/local/miniconda/envs/dev/lib/python2.7/site-packages/zmq/utils/jsonapi.py:31(dumps)
===
Пример файла сценария с именем primes.py:
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s=range(3, n + 1, 2)
mroot = n ** 0.5
half=(n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
return [2] + [x for x in s if x]
def prime(a, b):
print(primes(a))
print(primes(b))
if __name__ == "__main__":
prime(10, 100)