优化用于将字符串列表转换为整数和浮点的Python代码

2024-03-29 01:45:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试优化我的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不能提高第三块代码的速度?你知道吗


Tags: 代码indefaultmapfortimerangefloat
1条回答
网友
1楼 · 发布于 2024-03-29 01:45:01

我没有找到更快的代码,但是你最快的代码在某些情况下可能会出错。问题是,Python float(这是一个C double)的精度有限,对于超过2 ** 53(IIRC;可能在位计数上关闭一个)的值,它不能表示所有整数值。相比之下,Pythonint是任意精度的;如果您有内存,它可以有效地表示无限值。你知道吗

您需要更改:

values[0] = int(values[0])
values[1] = int(values[1])

收件人:

values[0] = int(words[0])
values[1] = int(words[1])

为了避免这种情况。重新分析将使其更依赖于被解析字符串的长度(因为对于较长的输入,多次转换的成本更高)。你知道吗

另一种至少在我的Python(3.5)上运行得相当快的方法是预先构造转换器集,以便可以直接调用正确的函数。例如:

words = ["1"] * 10
converters = (int,) * 2 + (float,) * 8

values = [f(v) for f, v in zip(converters, words)]

您想用两个版本的zip进行测试,看看生成基于list的生成器版本的itertools.izip是否更快(对于这样的简短输入,我真的不能说)。在python3.5中(其中zip总是一个类似Py2的itertools.izip的生成器),对于相同的输入,这比您最快的解决方案花费了大约10%的时间(我使用了min()timeit.repeat运行,而不是您使用的手动滚动版本);如果输入更大,它可能会做得更好(因此两次解析会更昂贵)。你知道吗

相关问题 更多 >