Timeit.timeit 方法。哪种方式是正确的:内部还是外部?
Timeit.timeit method. Which way is correct: inner or outer?
我想检查每个功能的速度,但我 运行 遇到了问题。如您所见,下面的代码包含两个相同的函数:func & func2。但是,func是直接在timeit.timeit方法中声明的。测试后得到的结果是:Func result: 0.08, func 2 result: 0.21.
。这是一个巨大的差异。
这里有个问题:为什么相同的函数速度不同?是时候从全局范围获取 func2 了吗?
import timeit
def func2() -> range:
return range(1024)
def main():
"""
Number of seconds for each function to perform with 500k executions
"""
func_res = round(timeit.timeit(
'def func() -> range: return range(1024); func()',
number=500_000
),
2)
func2_res = round(timeit.timeit(
'func2()',
number=500_000,
globals=globals()
),
2)
return f'Func result: {func_res}, func 2 result: {func2_res}.'
if __name__ == '__main__':
print(main())
P.S。 'def func() -> range: return range(1024)' ---> 'def func() -> range: return range(1024); func()' 已编辑。
您正在测试的两个语句完全不同。
第一个 (def func() -> range: return range(1024); func()
) 只测试 Python 声明函数体 return range(1024); func()
的速度。第二个实际上调用了函数。
因为timeit
也可以接受一个可调用的,你可以这样做
timeit.timeit(
func2,
number=500_000,
)
无论如何。
让我们尝试使用更好的测试平台:
import timeit
def func2() -> range:
return range(1024)
def t(name, stmt, setup="pass"):
res = timeit.timeit(stmt, setup, number=5_000_000, globals=globals()) * 1000
print(f"{name:>25} {int(res):5d}")
def main():
t("declare a func", "def func() -> range: return range(1024); func()")
t("declare & run func", "def func() -> range: return range(1024)\nfunc()")
t("run local func", "func()", "def func() -> range: return range(1024)")
t("run global func2 by name", "func2()")
t("run func2 by ref", func2)
if __name__ == "__main__":
main()
你可以看到声明 func
和 调用它的选项也慢得多(我机器上的数字,YMMV):
declare a func 547 # <-- doesn't call range!
declare & run func 1282 # <-- slow...
run local func 854 # <-- declare function once & call it
run global func2 by name 836
run func2 by ref 774
我想检查每个功能的速度,但我 运行 遇到了问题。如您所见,下面的代码包含两个相同的函数:func & func2。但是,func是直接在timeit.timeit方法中声明的。测试后得到的结果是:Func result: 0.08, func 2 result: 0.21.
。这是一个巨大的差异。
这里有个问题:为什么相同的函数速度不同?是时候从全局范围获取 func2 了吗?
import timeit
def func2() -> range:
return range(1024)
def main():
"""
Number of seconds for each function to perform with 500k executions
"""
func_res = round(timeit.timeit(
'def func() -> range: return range(1024); func()',
number=500_000
),
2)
func2_res = round(timeit.timeit(
'func2()',
number=500_000,
globals=globals()
),
2)
return f'Func result: {func_res}, func 2 result: {func2_res}.'
if __name__ == '__main__':
print(main())
P.S。 'def func() -> range: return range(1024)' ---> 'def func() -> range: return range(1024); func()' 已编辑。
您正在测试的两个语句完全不同。
第一个 (def func() -> range: return range(1024); func()
) 只测试 Python 声明函数体 return range(1024); func()
的速度。第二个实际上调用了函数。
因为timeit
也可以接受一个可调用的,你可以这样做
timeit.timeit(
func2,
number=500_000,
)
无论如何。
让我们尝试使用更好的测试平台:
import timeit
def func2() -> range:
return range(1024)
def t(name, stmt, setup="pass"):
res = timeit.timeit(stmt, setup, number=5_000_000, globals=globals()) * 1000
print(f"{name:>25} {int(res):5d}")
def main():
t("declare a func", "def func() -> range: return range(1024); func()")
t("declare & run func", "def func() -> range: return range(1024)\nfunc()")
t("run local func", "func()", "def func() -> range: return range(1024)")
t("run global func2 by name", "func2()")
t("run func2 by ref", func2)
if __name__ == "__main__":
main()
你可以看到声明 func
和 调用它的选项也慢得多(我机器上的数字,YMMV):
declare a func 547 # <-- doesn't call range!
declare & run func 1282 # <-- slow...
run local func 854 # <-- declare function once & call it
run global func2 by name 836
run func2 by ref 774