【问题标题】:Why is a function with a long name faster than the same small name function? [closed]为什么长名称的函数比相同的小名称函数更快? [关闭]
【发布时间】:2018-07-24 17:11:11
【问题描述】:
import time

def e(x):
    return x**x

def ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(x):
    return x**x

a = 0
start = time.process_time_ns()
a = e(7)
lap = time.process_time_ns()
a = ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(7)
end = time.process_time_ns()
print(lap-start)
print(end-lap)

我正在测试 python 函数的名称是否决定了调用速度,但令人惊讶的是,e()Z() 慢得多。我什至在计时之前定义了变量,但Z() 仍然更快。这是为什么呢?

【问题讨论】:

  • 这不是确定性能的可靠方法。使用timeit;我得到e 也许会稍微快一点,但不会快很多。
  • 这不是一种可靠的计时方式。使用timeit的性能相同:In [32]: %timeit e(100) 842 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [33]: %timeit ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(100) 834 ns ± 12.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
  • 不是。您的计时方法存在缺陷和偏见,因为现代操作系统在运行程序时不仅仅是屏住呼吸。您的计算机总是忙于许多不同的事情,而这些事情也需要时间。使用timeit 模块来解决这个问题并采取多种措施。
  • 我试试
  • 切换调用的顺序,你会发现先来的耗时更长。您正在计算启动成本。

标签: python python-3.x function


【解决方案1】:

实际上并没有变慢。为了获得准确的时间,您需要多次运行。在 Jupyter 中,您可以使用单元格顶部的魔法 %%timeit 为您执行此操作。我明白了:

a = e(7)
436 ns ± 21.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

a = ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ(7)
426 ns ± 13.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

或者,手动:

n_iter = 1000000
start = time.process_time()
for i in range(n_iter):
    e(7)  # or the other one, try both.
end = time.process_time()
print(f'{(end - start)/n_iter}')

这两个函数的结果与上述相似。

【讨论】:

  • 它仍然快 2% ;)
  • @wim 不是。运行时间之后的+- 21.8 ns+- 13.8 ns 为第一个提供415-457 ns 的范围,为第二个提供413-439 ns。两者完全重叠,它们的范围没有太大差异。如果没有进行正式的统计测试,我非常有信心它们在统计上没有差异。实际测试留给读者作为练习;)
  • 我在开玩笑 - 显然我的幽默感在这里错过了标记:P
  • 或者,如果您不是使用 anaconda 安装东西的数据科学家,请使用 ipython。
  • @wim 不是真的,只是让我有机会指出运行时间的统计性质,所以我接受了!
【解决方案2】:

函数的名称是完全不相关的,因为 python 命名空间是使用 dicts 实现的,它是哈希表……所以名称被转换为一个哈希值以供查找,所有名称的大小和速度都应该相同。

【讨论】:

  • 谢谢。我一直在寻找 Python 如何实现命名空间,但速度不够快......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2019-09-26
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多