Скрипты времени 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)
Другие вопросы по тегам