使用Python中的多个核心

时间:2016-06-06 19:07:42

标签: python multithreading parallel-processing multiprocessing bigdata

我有以下代码,当前正在运行,就像普通的Python代码一样:

def remove_missing_rows(app_list):
    print("########### Missing row removal ###########")
    missing_rows = []

''' Remove any row that has missing data in the name, id, or description column'''
    for row in app_list:
        if not row[1]:
            missing_rows.append(row)
            continue  # Continue loop to next row. No need to check more columns
        if not row[5]:
            missing_rows.append(row)
            continue  # Continue loop to next row. No need to check more columns
        if not row[4]:
            missing_rows.append(row)

    print("Number of missing entries: " + str(len(missing_rows)))  # 967 with current method

    # Remove the missing_rows from the original data
    app_list = [row for row in app_list if row not in missing_rows]
    return app_list

现在,在为较小的样本写这个之后,我希望在一个非常大的数据集上运行它。为此,我认为使用我的计算机的多个核心会很有用。

我正在努力使用多处理模块实现这一点。例如。我的想法是Core 1可以在数据集的前半部分工作,而Core 2可以在下半部分工作。等等。并行执行此操作。这可能吗?

2 个答案:

答案 0 :(得分:1)

这可能不是cpu绑定的。请尝试下面的代码。

我已经使用set非常快(基于哈希)contains(您在调用if row not in missing_rows时使用它,而且它非常慢很长的名单)。

如果这是csv模块,那么您已经拥有可以清除的元组,因此所需的更改不多:

def remove_missing_rows(app_list):
    print("########### Missing row removal ###########")
    filterfunc = lambda row: not all([row[1], row[4], row[5]])
    missing_rows = set(filter(filterfunc, app_list))

    print("Number of missing entries: " + str(len(missing_rows)))  # 967 with current method

    # Remove the missing_rows from the original data
    # note: should be a lot faster with a set
    app_list = [row for row in app_list if row not in missing_rows]
    return app_list

答案 1 :(得分:1)

你可以使用过滤器,不要迭代两次:

def remove_missing_rows(app_list):

    filter_func = lambda row: all((row[1], row[4], row[5]))

    return list(filter(filter_func, app_list))

但是如果你正在进行数据分析,你可能应该看看大熊猫。 在那里你可以做这样的事情:

import pandas as pd

df = pd.read_csv('your/csv/data/file', usecols=(1, 4, 5))
df = df.dropna() # remove missing values