Как заставить timeit распознавать определенные входы - PullRequest
0 голосов
/ 13 января 2019

У меня есть определенный df, на котором я успешно выполняю операции. Я хочу оценить разницу между итеративными циклами for и векторизованными операциями. Я читал различные примеры использования timeit, но когда я их пробую, я получаю ошибки ниже. Что я делаю не так?

Импорт:

import h5py
import pandas as pd
import timeit

Этот цикл работает:

for u in df['owner'].unique():
    print(u, ': ', len(df[(df['owner'] == u)]), sep = '')

Но когда я пытаюсь рассчитать время так: ...

s = """\
for u in df['owner'].unique():
    print(u, ': ', len(df[(df['owner'] == u)]), sep = '')"""

time_iter_1_1_1 = timeit.timeit(s)

... выдает эту ошибку:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-34-7526e96d565c> in <module>()
      3 #     print(u, ': ', len(df[(df['owner'] == u)]), sep = '')""")
      4 
----> 5 time_iter_1_1_1 = timeit.timeit(s)

~\Anaconda2\envs\py36\lib\timeit.py in timeit(stmt, setup, timer, number, globals)
    231            number=default_number, globals=None):
    232     """Convenience function to create Timer object and call timeit method."""
--> 233     return Timer(stmt, setup, timer, globals).timeit(number)
    234 
    235 def repeat(stmt="pass", setup="pass", timer=default_timer,

~\Anaconda2\envs\py36\lib\timeit.py in timeit(self, number)
    176         gc.disable()
    177         try:
--> 178             timing = self.inner(it, self.timer)
    179         finally:
    180             if gcold:

~\Anaconda2\envs\py36\lib\timeit.py in inner(_it, _timer)

NameError: name 'df' is not defined

И когда я попробую это ...:

time_iter_1_1_1 = timeit.timeit(
"""for u in df['owner'].unique():
    print(u, ': ', len(df[(df['owner'] == u)]), sep = '')""")

... Я получаю эту ошибку:

ERROR:root:An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 57))

...

NameError: name 'df' is not defined

ДФ определен и работает. Как я могу это исправить?

1 Ответ

0 голосов
/ 13 января 2019

Есть два варианта, либо

  1. Передать аргумент globals, который позволяет timeit разрешить имя,

df = pd.DataFrame(...)
timeit.timeit(statement, globals={'df': df}) # globals=globals()

  1. ... Или передайте строковый аргумент setup, который устанавливает для вас df.

timeit.timeit(statement, setup='import pandas as pd; df = pd.DataFrame(...)')
...