首页 > 解决方案 > 让处理 2400 万条记录的 python 代码更快

问题描述

我正在尝试处理熊猫数据框。我正在将功能应用于其中一列。

功能是:

def separate_string(sentence):
    string_even = ""
    if sentence is not None:
        l = list(sentence)
        list_even = list()
        index = 0    
        for letter in l:
            if index % 2 != 0:
               if abs(ord(letter)-3) < 1114111:
                    list_even.append((chr(abs(ord(letter)-3))))
               string_even = "".join(list_even)
            index += 1
    return(str(string_even))

熊猫数据框:

df['re'] = df.col1.apply(separate_string)

我在具有 64GB RAM 2.19Ghz 7 处理器的 PC 上运行它。为什么代码永远不会完成?

标签: pythonpython-3.xpandas

解决方案


我认为这可以满足您的要求。如果需要,您可能必须显式返回None,而不是空字符串。

删除了很多东西,例如不需要的强制转换和索引的手动维护以及代码点小于 1114111 的测试,因为它们都将是。

def separate_string(sentence):
    return "".join(chr(abs(ord(letter) -3)) for letter in sentence[1::2])

我们可以timeit看看我们是否有改进:

import timeit

setup_orig = '''
test = "This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever."
def separate_string(sentence):
    string_even = ""
    if sentence is not None:
        l = list(sentence)
        list_even = list()
        index = 0    
        for letter in l:
            if index % 2 != 0:
               if abs(ord(letter)-3) < 1114111:
                    list_even.append((chr(abs(ord(letter)-3))))
               string_even = "".join(list_even)
            index += 1
    return(str(string_even))
'''

setup_new = '''
test = "This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever."
def separate_string(sentence):
    return "".join(chr(abs(ord(letter) -3)) for letter in sentence[1::2])
'''

print(timeit.timeit('separate_string(test)', setup=setup_orig, number=100_000))
print(timeit.timeit('separate_string(test)', setup=setup_new, number=100_000))

在我的笔记本电脑上,结果如下:

5.33
0.95

因此,作为解决方案的一部分,它似乎值得探索。


推荐阅读