我正在尝试从数据库中获取一个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中将变量转换为自己的类型是否需要花费?
答案 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%左右的字符串是关于你从一种方法跨越到另一种方法的时间。