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

在python中,将变量转换为它自己的类型会浪费CPU资源吗?,python,types,int,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中将一个变量转换为它自己的类型需要花费多少钱 ~/Coding > python -m

我试图从数据库中获取一个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中将一个变量转换为它自己的类型需要花费多少钱

~/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是字符串,以查看哪个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%的字符串大约是从一种方法转换到另一种方法的时间。

我认为更好的问题是“类型检查比将类型转换为自身需要更长的时间吗?”除非你每秒处理数百万个值,这不太可能在CPU使用率上产生任何明显的差异。无论哪种方法的效率高低,做这两件事都会挫败任何利用duck类型的尝试。我认为这两个都是不好的做法。在试图将不一致的输入从外部资源转换成一致的类型时,我看不出有什么害处。如果你真的担心这样一个纳米级的CPU使用率,那么你就不应该首先使用Python。在第一个命令行中使用
lambda
,与在第二个命令行中使用lambda的方式相同,应该可以进行公平的比较。