在python中,将变量转换为自己的类型会浪费CPU能力吗?

时间:2014-07-28 03:33:26

标签: python types int

我正在尝试从数据库中获取一个int id号,并且一些id被错误地存储为字符串,我想知道以下哪种方式更好:

# the first method
new_id = int(old_id) + 1
# second
if isinstance(old_id, str):
    new_id = int(old_id) + 1
else:
    new_id = old_id +1

所以问题是,在python中将变量转换为自己的类型是否需要花费?

1 个答案:

答案 0 :(得分:1)

让我们检查一下!

~/Coding >  python -m timeit -s "id1=1;id2='1'" "new_id = int(id1)" "new_id = int(id2)"
1000000 loops, best of 3: 0.755 usec per loop
~/Coding >  python -m timeit -s "id1=1;id2='1';f=lambda x: int(x) if isinstance(x, str) else x" "new_id=f(id1)" "new_id=f(id2)"
1000000 loops, best of 3: 1.15 usec per loop

看起来最有效的方法就是在不进行检查的情况下进行int转换。

我很乐意纠正这里的问题是lambda或我做过的其他事情。

<强>更新 这实际上可能不是一个公平的答案,因为if检查本身比类型转换快得多。

~/Coding >  python -m timeit "int('3')"
1000000 loops, best of 3: 0.562 usec per loop
~/Coding >  python -m timeit "int(3)"
10000000 loops, best of 3: 0.136 usec per loop
~/Coding >  python -m timeit "if isinstance('3', str): pass"
10000000 loops, best of 3: 0.0966 usec per loop

这意味着它取决于您期望成为字符串的ID数,以确定哪些值得。

更新2: 我在这里有点落伍,但我们可以确定何时使用上述时间切换,具体取决于您期望的字符串数量。

其中z是id的总数,s是字符串的百分比,所有值都以微秒为单位,

Always check type: (assuming returning int costs 0 time)
.0966*z + .562*z*s

Always convert without checking:
.136*z*(1-s) + .562*z*s

当我们进行数学计算时,z和字符串转换会被取消(因为你必须转换字符串),我们最终得到以下内容:

s ~= 0.289706

所以看起来29%左右的字符串是关于你从一种方法跨越到另一种方法的时间。