我想知道为什么repr(int)
比str(int)
更快。以下是代码片段:
ROUNDS = 10000
def concat_strings_str():
return ''.join(map(str, range(ROUNDS)))
def concat_strings_repr():
return ''.join(map(repr, range(ROUNDS)))
%timeit concat_strings_str()
%timeit concat_strings_repr()
我得到了这些时间(使用Python 3.5.2,但使用2.7.12也会得到非常相似的结果):
1.9 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.38 ms ± 9.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
如果我走在正确的道路上,底层正在调用相同的函数long_to_decimal_string
。
我是不是做错了什么,或者还有其他我所忽略的事情?
更新:
这可能与int
的__repr__
或__str__
方法无关,而与repr()
和str()
之间的差异有关,因为实际上int.__str__
和int.__repr__
是相当快的:
def concat_strings_str():
return ''.join([one.__str__() for one in range(ROUNDS)])
def concat_strings_repr():
return ''.join([one.__repr__() for one in range(ROUNDS)])
%timeit concat_strings_str()
%timeit concat_strings_repr()
结果为:
2.02 ms ± 24.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.05 ms ± 7.07 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
python3 -m timeit“''.join(map(repr, range(10000)))”
和等效的str
版本或多次运行进行复现。这应该消除大部分关于缓存等方面的担忧。但是,如果我去掉join
,差异就会消失。python3 -m timeit“map(str, range(10000))”
- Rob Napierjoin
,repr
(或str
)实际上不会被调用。@RobNapier - Christian Geiermap
返回一个迭代器,因此这段代码实际上并没有做任何事情——你需要构建一个列表,比如python3 -m timeit "list(map(str, range(10000)))"
。 - AChampion