2014-07-28 4 views
12

Как я могу выполнить выполнение скрипта Python с помощью команд iPython% time или %% timeit magic? Например, у меня есть script.py, и я хотел бы знать, сколько времени потребуется для выполнения. Малый нюанс: script.py требует входных параметров. Нижеследующее не работает.Временные скрипты python с использованием магии IPython

%%time script.py input_param1 input_param2 
+1

Как примечание стороны, почему бы не рефакторинга, рефакторинга 'сценарий .py', чтобы его можно было использовать в качестве модуля (так что вы можете его импортировать, а затем 'script.run (input_param1, input_param2)' делает то же самое, что и эти два значения: 'sys.argv [1: 3]' в командной строке)? Это, вероятно, поможет для всех видов тестирования, а не только для тестирования производительности ... – abarnert

+0

@abarnert, не против ли вы дать быстрый пример того, как он будет выглядеть как refactor script.py в качестве модуля? – user1507844

ответ

25

Решение

Вы можете использовать:

%%timeit 
%run script.py input_param1 input_param2 

учтите, что сценарий будет выполняться несколько раз (число адаптивно). Чтобы выполнить только один раз (и имеют менее точные сроки) изменить первую строку

%%timeit -n1 -r1 

Объяснение

Все магические команды, начиная с %% применяются ко всей клетке. В частности, %%timeit будет время всех строк в ячейке.

IPython позволяет использовать магические команды (одиночные %) в любой точке вашего кода (т. Е. Петли, если-то). Здесь мы просто используем магическую команду %run для запуска скрипта.

См. Также: Magic functions из официальных документов IPython.

2

Вы также можете попробовать 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) 
Смежные вопросы