我正在尝试优化我的python2.7.x代码。我将在for循环中执行一个操作,可能会执行数百万次,所以我希望它尽可能快。你知道吗
我的操作是获取一个包含10个字符串的列表,然后将它们转换为2个整数和8个浮点。你知道吗
以下是我的一些尝试:
import timeit
words = ["1"] * 10
start_time = timeit.default_timer()
for ii in range(1000000):
values = map(float, words)
values[0] = int(values[0])
values[1] = int(values[1])
print "1", timeit.default_timer() - start_time
start_time = timeit.default_timer()
for ii in range(1000000):
values = map(int, words[:2]) + map(float, words[2:])
print "2", timeit.default_timer() - start_time
start_time = timeit.default_timer()
local_map = map
for ii in range(1000000):
values = local_map(float, words)
values[0] = int(values[0])
values[1] = int(values[1])
print "3", timeit.default_timer() - start_time
1 2.86574220657
2 3.83825802803
3 2.86320781708
第一段代码是我处理过的最快的。map
函数似乎比使用列表理解快得多。但是仍然有一些冗余,因为我把所有的东西都映射到一个float,然后把前两项改成整数。你知道吗
有什么比我的密码快的吗?你知道吗
为什么让map函数本地化local_map = map
不能提高第三块代码的速度?你知道吗
我没有找到更快的代码,但是你最快的代码在某些情况下可能会出错。问题是,Python
float
(这是一个C double)的精度有限,对于超过2 ** 53
(IIRC;可能在位计数上关闭一个)的值,它不能表示所有整数值。相比之下,Pythonint
是任意精度的;如果您有内存,它可以有效地表示无限值。你知道吗您需要更改:
收件人:
为了避免这种情况。重新分析将使其更依赖于被解析字符串的长度(因为对于较长的输入,多次转换的成本更高)。你知道吗
另一种至少在我的Python(3.5)上运行得相当快的方法是预先构造转换器集,以便可以直接调用正确的函数。例如:
您想用两个版本的
zip
进行测试,看看生成基于list
的生成器版本的itertools.izip
是否更快(对于这样的简短输入,我真的不能说)。在python3.5中(其中zip
总是一个类似Py2的itertools.izip
的生成器),对于相同的输入,这比您最快的解决方案花费了大约10%的时间(我使用了min()
的timeit.repeat
运行,而不是您使用的手动滚动版本);如果输入更大,它可能会做得更好(因此两次解析会更昂贵)。你知道吗相关问题 更多 >
编程相关推荐