【问题标题】:Time function with arguments in pythonpython中带参数的时间函数
【发布时间】:2016-06-24 20:34:16
【问题描述】:

我有一个以字符串为参数的函数,它返回两个列表

例如

def return_words(string):
    return list1, list2

显然中间有代码。我希望能够为各种字符串准确计时,因为我需要在输入长字符串时提高效率。

对不起,如果这是一个微不足道的问题,因为我是 python 新手。

谢谢

【问题讨论】:

  • 您的问题不明确且广泛。 我希望能够为各种字符串准确计时这个函数是什么意思,因为我需要在输入长字符串时提高效率。

标签: python function python-3.x time


【解决方案1】:

您可以使用timeit 模块并在timeitsetup 参数中传递参数:

from timeit import timeit


inp = """
def return_words(string):
    return list1, list2
return_words(string)
   """

for s in list_of_inputs:
    print '{}'.format(s), '->', timeit(stmt=inp,
                                       number=1000000,
                                       setup="string = '{}'".format(s))

演示:

inp = """
def return_words(string):
    return [i for i in string if i.isdigit()]

return_words(string)
   """

list_of_inputs = ['inputstring1', 'inp2']

for s in list_of_inputs:
    print '{}'.format(s), '->', timeit(stmt=inp,
                                       number=1000000,
                                       setup="string = '{}'".format(s))

输出:

inputstring1 -> 0.986068964005
inp2 -> 0.548749923706

注意 timeit 也接受一个函数作为您代码中定义的第一个参数,但您不能将参数传递给它。在这种情况下,最好创建一个包装器,它将使用相对参数调用您的函数。阅读http://pythoncentral.io/time-a-python-function/了解更多信息。

【讨论】:

  • 是否可以使用return_words(string)作为timeit的参数而不是stmt=inp?
【解决方案2】:

另一种选择是使用时间和时间增量。你可以修改下面的代码

import time
from datetime import timedelta


start_time = time.time()
//do stuff
end_time = time.time()
time_slice = end_time - start_time
human_time = str(timedelta(seconds=int(time_slice)))

【讨论】:

    【解决方案3】:

    在 Python 3.7 中,有一个新的nanosecond timer

    >>> st={time.time_ns() for e in range(10000000)}
    >>> (max(st)-min(st))/10**9
    2.275888
    

    所以范围计数器(并多次调用time.time_ns())到 10,000,000 需要 2.275888 秒...

    还有一个纳秒级精度的性能计时器(range 部分需要多长时间?):

    >>> t1=time.perf_counter_ns(); x={y for y in range(10000000)}; t2=time.perf_counter_ns()
    >>> (t2-t1)/10**9
    0.860256448
    

    timeit 模块:

    >>> timeit.timeit("x={_ for _ in range(10000000)}",number=1)
    0.7478707919999579
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2018-12-28
      • 2015-04-29
      相关资源
      最近更新 更多