如何使用大型数据集并行化python循环

时间:2018-05-19 05:21:24

标签: python pandas parallel-processing multiprocessing

我正在尝试在给定数据集的情况下构建层次结构,其中每行代表学生,他们已经采取的课程以及一些其他元数据。从这个数据集中,我试图构建一个邻接矩阵,并根据学生所选择的课程以及不同学生在选择课程时所采取的路径来确定等级。

话虽如此,为了构建这种邻接矩阵,它的计算成本很高。这是我目前的代码,已经运行了大约2个小时。

uniqueStudentIds = df.Id.unique()
uniqueClasses = df['Course_Title'].unique()
for studentID in uniqueStudentIds:
    for course1 in uniqueClasses:
        for course2 in uniqueClasses:
            if (course1 != course2 and have_taken_both_courses(course1, course2, studentID)):
                x = vertexDict[course1]
                y = vertexDict[course2]
                # Assuming symmetry
                adjacency_matrix[x][y] += 1
                adjacency_matrix[y][x] += 1
                print(course1 + ', ' + course2)


def have_taken_both_courses(course1, course2, studentID):
    hasTakenFirstCourse = len(df.loc[(df['Course_Title'] == course1) & (df['Id'] == studentID)]) > 0
    if hasTakenFirstCourse:
        return len(df.loc[(df['Course_Title'] == course2) & (df['Id'] == studentID)]) > 0
    else:
        return False

鉴于我有一个非常大的数据集大小,我试图在并行/多线程中查询这个计算成本高昂的循环的在线资源。但是,我是python和多处理的新手,所以任何指导都会非常感激!

1 个答案:

答案 0 :(得分:3)

它似乎比你必须的循环方式更多。对于每个学生,您进行NxN迭代,其中N是类的总数。但是你的学生只参加了这些课程的一部分。因此,您可以显着减少迭代。

你的have_taken_both_courses()查询也比它需要的更贵。

这样的事情可能会更快:

compile 'com.android.support:multidex:1.0.1'