大家好:我是Stack Overflow的新手,对python来说还是新手,但是我已经编写了多年的代码,并且想知道以下哪个会有更好的性能。
假设我已从os加载了envioron,并且环境中的标志保证为“0”或“1”。
if environ["Flag"] == "1":
do_something
或
if int(environ["Flag"]) == 1:
do something
乍一看,看起来转换为int,然后因为转换比较会慢一些,但是,我知道字符串比较也可能很慢。
有没有人检查过这个?
谢谢,Mark。
答案 0 :(得分:4)
In [44]: timeit int("1") == 1
1000000 loops, best of 3: 380 ns per loop
In [44]: timeit "1" == "1"
10000000 loops, best of 3: 36.5 ns per loop
转换为int总是会慢一些,这很有意义,你从一个字符串开始然后转换为int而不是只创建一个字符串。
转换是成本最高的部分:
In [45]: timeit 1
100000000 loops, best of 3: 11.9 ns per loop
In [46]: timeit "1"
100000000 loops, best of 3: 11 ns per loop
In [47]: timeit int("1")
1000000 loops, best of 3: 366 ns per loop
使用a = "1"
创建字符串与执行a = 1 b = str(1)
之间存在差异,这是您可能感到困惑的地方。
In [3]: a = 1
In [4]: timeit str(b)
10000000 loops, best of 3: 135 ns per loop
使用python2.7定时,使用python 3的差异几乎相同。
输出来自我的ipython终端,使用ipython magic timeit function
答案 1 :(得分:2)
为什么不自己检查一下:
import timeit
print(timeit.timeit('a="1"; a == "1"', number=10000))
print(timeit.timeit('a="1"; int(a) == 1', number=10000))
我的结果是:
0.0003461789892753586
0.0019836849969578907
这表明字符串比较要快得多。
答案 2 :(得分:2)
其他人是正确的,如果有疑问,请及时。
但这里有一点解释:
比较两个字符串时,算法如下所示:
from 0 to the length of the shortest string
if characters at this position are different
return false
return true
所以字符串比较的速度完全取决于字符串的数量是多少。在您的示例中,您要与" 1"进行比较,这是一个字符串。所以在你的情况下,归结为:
if environ["Flag"][0] == "1"[0]
换句话说,它将单个字节与另一个字节进行比较。显然,单一的比较会很快。
在第二种情况下,您将字符串转换为int
。这需要一点时间。但是如果我们假设最好的情况,并且标志总是" 0"或" 1",它可能类似于:
i = s[0] - ord("0")
然后你比较两个整数。整数是四个字节,而不是一个,但这在现代芯片上可能并不重要。
但无论如何,这意味着当你比较两个字符串时,你正在进行一次比较。转换为int时,您正在进行转换工作,然后进行单个比较。因此,字符串比较更快。
但同样,这是情境性的。它更快,因为你正在比较两个长度为1的字符串。比较两个整数的速度是恒定的,但比较两个字符串与较短字符串的长度成正比。
最后,从环境变量中取出一个标志是每次运行只执行一次的事情。我们在你做过一次的事情上谈论几百纳秒。这种规模的差异只值得担心在循环中运行很多次。在这种情况下,不要担心表现并担心什么读得更好。 (这可能仍然是字符串比较版本。)