【发布时间】:2018-09-19 00:16:07
【问题描述】:
给定以下三个函数
def v1(a):
c = 0
for a_ in a:
if a_ is not None:
c += 1
return c
def v2(a):
c = 0
for a_ in a:
if a_:
c += 1
return c
def v3(a):
c = 0
for a_ in a:
if bool(a_):
c += 1
return c
我得到以下性能(我在 ubuntu 18.04 上使用 python 3.6)
values = [random.choice([1, None]) for _ in range(100000)]
%timeit v1(values)
3.35 ms ± 28 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit v2(values)
2.83 ms ± 36.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit v3(values)
12.3 ms ± 59.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
v1 和 v2 之间的类似性能是有道理的,但考虑到 v2 可能也在隐式调用 bool(a_),为什么 v3 这么慢?
是不是简单地从 python 调用 bool() 而不是从 c(我假设 if 确实如此)导致性能差异?
【问题讨论】:
-
因为内置...甚至
x比len(x) != 0或x != []更快。 (在某些问题中) -
(
c += bool(a)呢?) -
我相信
bool()实际上会实例化一个 bool 类对象,然后进行会导致性能下降的检查 -
bool()是一个类或类型构造函数,它是通用的,没有针对这个任务进行优化,相关:stackoverflow.com/questions/49009870/…
标签: python performance python-3.6