标签: timeit

使用timeit时导入的正确方法是什么?

我正在测试以前的一个问题中的以下代码(将列表转换为字典):

single = ['key1', 'value1', 'key2', 'value2', 'key3', 'value3']

if __name__ == '__main__':
    from timeit import Timer
    print Timer("dict(zip(single[::2], single[1::2]))",
        "from __main__ import single").timeit()
    print Timer("si = iter(single); dict(izip(si, si))",
        "from __main__ import single; from itertools import izip").timeit()
Run Code Online (Sandbox Code Playgroud)

而我不能确定是否使用时,最好的做法timeit是进口izipTimer的语句或设置(我假设的设置,但最终的结果时间有所不同,这取决于我做的).

无论如何,我只是希望你们在为代码计时等时获得任何额外的见解.(另外,我只是想学习 - 我不会因为过早的优化或任何事情而受苦.)

谢谢.

python import timeit

5
推荐指数
1
解决办法
1633
查看次数

为什么手动字符串反转比Python 2.7中的反转更差?Slice中使用的算法是什么?

低于Slice和手动反向操作之间的性能差异.如果是这种情况,那是什么原因?

timeit.timeit("a[::-1]","a=[1,2,3,4,5,6]",number=100)
6.054327968740836e-05

timeit.timeit("[a[i] for i in range(len(a)-1,-1,-1)]","a=[1,2,3,4,5,6]",number=100)
0.0003132152330920235
Run Code Online (Sandbox Code Playgroud)

python timeit slice python-2.7

5
推荐指数
1
解决办法
585
查看次数

将函数中的局部变量导入timeit

我需要在可变数量的数据上计时函数的执行时间。

def foo(raw_data):
   preprocessed_data = preprocess_data(raw_data)
   time = timeit.Timer('module.expensive_func(preprocessed_data)', 'import module').timeit()
Run Code Online (Sandbox Code Playgroud)

但是,preprocessed_data不是全局变量。无法使用导入from __main__。它在此子例程中是本地的。

如何导入datatimeit.Timer环境中?

python namespaces timeit

5
推荐指数
1
解决办法
1160
查看次数

Python timeit设置中的局部变量

在我读到的关于timeit的所有地方,我发现只能以这种方式使用变量:

s1 = 'abc'
s2 = 'abc'
timeit.timeit('s1==s2', 'from __main__ import s1, s2', number=10**4)
Run Code Online (Sandbox Code Playgroud)

要么

s1 = 'abc'
s2 = 'abc'
def func():
    timeit.time('s1==s2', 'from __main__ import s1,s2', number=10**4)
Run Code Online (Sandbox Code Playgroud)

which means that you can also use timeit.timeit in a function as long as the variables are in the main program. I would like to use timeit.timeit with variables that are within the scope it is in, for example:

def func():
    s1 = 'abc'
    s2 = 'abc'
    timeit.timeit(...)
Run Code Online (Sandbox Code Playgroud)

As you …

python string variables scope timeit

5
推荐指数
1
解决办法
5298
查看次数

将参数传递给timeit.Timer()函数时棘手的Python字符串文字

我在Python的timeit.Timer(stmt,setup_stmt)中使用setup语句很难.我感谢任何帮助,让我摆脱这个棘手的问题:

所以我的sniplet看起来像这样:

def compare(string1, string2):
    # compare 2 strings

if __name__ = '__main__':
    str1 = "This string has \n several new lines \n in the middle"
    str2 = "This string hasn't any new line, but a single quote ('), in the middle"

    t = timeit.Timer('compare(p1, p2)', "from __main__ import compare; p1=%s, p2=%s" % (str1,str2))
Run Code Online (Sandbox Code Playgroud)

我不知道如何在变量str1,str2中转义元字符而不改变它们在setup语句中的含义:

"from __main__ import compare; p1=%s, p2=%s" % (str1,str2)
Run Code Online (Sandbox Code Playgroud)

我尝试了各种组合,但总是有以下错误:SyntaxError:
扫描单引号字符串时无法分配给文字
语法错误:EOL 语法错误:语法无效

python string-literals timeit

4
推荐指数
1
解决办法
5323
查看次数

Python - 类中的Timeit

我在一个类的实例中计时函数时遇到了一些麻烦.我不确定我是不是以正确的方式(从未使用过时间),我尝试了第二个参数导入内容的一些变体,但没有运气.这是我正在做的一个愚蠢的例子:

import timeit

class TimedClass():
    def __init__(self):
        self.x = 13
        self.y = 15
        t = timeit.Timer("self.square(self.x, self.y)")
        try:
            t.timeit()
        except:
            t.print_exc()

    def square(self, _x, _y):
        print _x**_y

myTimedClass = TimedClass()
Run Code Online (Sandbox Code Playgroud)

哪,跑步时,抱怨自我.

Traceback (most recent call last):
  File "timeItTest.py", line 9, in __init__
    t.timeit()
  File "C:\Python26\lib\timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
    self.square(self.x, self.y)
NameError: global name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

这与TimeIt创建一个虚拟环境以运行该函数有关,但是我需要传递给第二个参数以使其全部满意?

python self timeit

4
推荐指数
3
解决办法
7268
查看次数

关闭垃圾收集可以获得什么?

我正在阅读timeit模块的代码,我注意到了这一段:

gcold = gc.isenabled()
gc.disable()
timing = self.inner(it, self.timer)
if gcold:
    gc.enable()
Run Code Online (Sandbox Code Playgroud)

这只是存储垃圾收集的状态(打开或关闭),然后将其关闭.该函数inner执行正在计时的语句.然后它将垃圾收集器恢复到旧状态.

所以我很好奇这是什么意思.如果被测试的代码在垃圾收集器中运行,那么不应该在测试中反映出来吗?我错过了什么?

python garbage-collection timeit

4
推荐指数
2
解决办法
995
查看次数

如何将*args传递给我的timeit.Timer对象?

我最初为定时函数创建了一个自定义函数,如下所示:

def timefunc(function, *args):
    start = time.time()
    data = function(*args)
    end = time.time()
    time_taken = end - start
    print "Function: "+function.__name__
    print "Time taken:",time_taken
    return data
Run Code Online (Sandbox Code Playgroud)

现在,了解了timeit模块后,我想用它来实现相同的功能.在发送函数和*args参数时,我无法弄清楚如何做到这一点.我已经发现我必须在setup arg中执行此操作:

"from __main__ import function"
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何处理*args,因为'stmt'和'setup'参数都是字符串,我怎么能传递变量?

python function args timeit

4
推荐指数
1
解决办法
915
查看次数

在带参数的函数中使用timeit模块

文档示例

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
Run Code Online (Sandbox Code Playgroud)

但是如何使用参数调用函数,例如,像这样的函数:

def test(some_object):
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(some_object)
Run Code Online (Sandbox Code Playgroud)

python timeit

4
推荐指数
1
解决办法
4680
查看次数

一次添加需要多少CPU周期?

我想测量在Python 3中进行加法运算所需的时钟周期数.

我写了一个程序来计算加法运算的平均值:

from timeit import timeit

def test(n):
    for i in range(n):
      1 + 1

if __name__ == '__main__':

    times = {}
    for i in [2 ** n for n in range(10)]:
      t = timeit.timeit("test(%d)" % i, setup="from __main__ import test", number=100000)
      times[i] = t
      print("%d additions takes %f" % (i, t))

    keys = sorted(list(times.keys()))

    for i in range(len(keys) - 2):
      print("1 addition takes %f" % ((times[keys[i+1]] - times[keys[i]]) / (keys[i+1] - keys[i])))
Run Code Online (Sandbox Code Playgroud)

输出:

16 additions takes 0.288647
32 …
Run Code Online (Sandbox Code Playgroud)

python assembly clock timeit

4
推荐指数
2
解决办法
1744
查看次数