python如何使timeit识别定义的输入

python如何使timeit识别定义的输入,python,pandas,timeit,Python,Pandas,Timeit,我已经定义了一个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 = '') 但是当我试着这样

我已经定义了一个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
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
。。。我得到这个错误:

---------------------------------------------------------------------------
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
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

df已定义并工作。如何解决此问题?

也有两种选择

传递允许timeit解析名称的参数globals, …或者,传递为您设置df的字符串参数设置。
我正在Jupyter笔记本上运行Python3.6。谢谢你,coldspeed,globals参数工作得很好:time_iter_1_1_1_1=timeit.timeits,globals={'df':df}我想,目前在第五遍打印了700行输出。我认为这是因为它返回了几次运行的最佳时间。还等着看最后的结果呢。我说得太早了。虽然传递globals允许timeit函数运行,但它只是无休止地重复。我用一个只有6行数据的df进行了尝试,它重复了数千次,就好像是在一个无止境的循环中。有什么想法吗?@KarlBaker传递一个数字参数:数字=30或任何你认为合适的数字。结果时间它是X次运行的总时间,不管你传递的是什么。对于arg这个数字,我在最后得到一个错误。它正确地运行了2次,但随后抛出了一个错误。有什么想法吗?time\u iter\u 1\u 1\u 1=mintimeit.timeits,setup=setup,-->number=2 TypeError:“float”对象不是iterable我让它使用全局变量而不是setup:time\u iter\u 1\u 1=timeit.timeits,全局变量={'df':df},number=1
timeit.timeit(statement, setup='import pandas as pd; df = pd.DataFrame(...)')