性能:(比较字符串)vs(转换为int)

时间:2015-02-13 00:24:27

标签: python

大家好:我是Stack Overflow的新手,对python来说还是新手,但是我已经编写了多年的代码,并且想知道以下哪个会有更好的性能。

假设我已从os加载了envioron,并且环境中的标志保证为“0”或“1”。

if environ["Flag"] == "1":
    do_something

if int(environ["Flag"]) == 1:
    do something

乍一看,看起来转换为int,然后因为转换比较会慢一些,但是,我知道字符串比较也可能很慢。

有没有人检查过这个?

谢谢,Mark。

3 个答案:

答案 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的字符串。比较两个整数的速度是恒定的,但比较两个字符串与较短字符串的长度成正比。

最后,从环境变量中取出一个标志是每次运行只执行一次的事情。我们在你做过一次的事情上谈论几百纳秒。这种规模的差异只值得担心在循环中运行很多次。在这种情况下,不要担心表现并担心什么读得更好。 (这可能仍然是字符串比较版本。)