所以这是CPython的问题,不确定其他实现是否具有相同的行为。
但是,'{0}'.format()
比str()
和'{}'.format()
更快。我发布了来自Python 3.5.2的结果,但我尝试过Python 2.7.12,趋势是相同的。
%timeit q=['{0}'.format(i) for i in range(100, 100000, 100)]
%timeit q=[str(i) for i in range(100, 100000, 100)]
%timeit q=['{}'.format(i) for i in range(100, 100000, 100)]
1000 loops, best of 3: 231 µs per loop
1000 loops, best of 3: 298 µs per loop
1000 loops, best of 3: 434 µs per loop
从文档中查看object.__str__(self)
:
被
str(object)
和内置函数format()
及print()
调用,用于计算对象的“非正式”或可打印字符串表示。
所以,str()
和format()
都调用同一个方法object.__str__(self)
,但速度上的差异从何而来?
更新
如@StefanPochmann和@Leon在评论中指出,它们获得了不同的结果。我尝试使用python -m timeit "..."
运行它们,他们是正确的,因为结果如下:
$ python3 -m timeit "['{0}'.format(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 441 usec per loop
$ python3 -m timeit "[str(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 297 usec per loop
$ python3 -m timeit "['{}'.format(i) for i in range(100, 100000, 100)]"
1000 loops, best of 3: 420 usec per loop
看起来IPython正在做一些奇怪的事情...
新问题: 通过速度,将对象转换为str
的首选方式是什么?
i.__str__()
。虽然str
才是正确的方式。难道它对您来说还不够快吗? - Stefan Pochmann