在python中使用大型csv

在python中使用大型csv,python,csv,numpy,pandas,Python,Csv,Numpy,Pandas,我有一个csv文件中的大表,它有500万行和4列。 我的目标是从第一个500k中提取每一行,并根据特定条件将其与以下所有行(即5kk-n)进行比较。这种情况有点像 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和行(n)。列3==行(n+1)。列3 或 行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和 行(n+1).column4.split()[0]位于行(n).column4中 现在我使用的是简单的循环列表: for idx,i in

我有一个csv文件中的大表,它有500万行和4列。 我的目标是从第一个500k中提取每一行,并根据特定条件将其与以下所有行(即5kk-n)进行比较。这种情况有点像

行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和行(n)。列3==行(n+1)。列3

行(n)。列1==行(n+1)。列1和行(n)。列2==行(n+1)。列2和 行(n+1).column4.split()[0]位于行(n).column4中

现在我使用的是简单的循环列表:

for idx,i in enumerate(big[:500000]):
    for jdx,j in enumerate(big):
        if (jdx>idx and i[0]==j[0] and i[1]==j[1] and i[2]==j[2]) or (i[0]==j[0] and i[1]==j[1] and j[3].split()[0] if j[3].split() else '' in i[3]):
            matches.append([idx,jdx])
这显然需要很长时间才能完成(使用单个进程大约需要一周)。 Pandas和numpy对于一次对整个阵列进行操作是很好的,但我不知道我是否能够以某种方式将此任务转换为它们


因此,问题是,如何加快进程?

我最终使用以下方法来提高性能

  • 函数中的分离回路(约20%增益)
  • 改进的逻辑操作
  • 使用PyPy解释器(增加300%)

  • 您正在执行大约1.2万亿个if语句。由于整个数据集都在主内存中,因此I/O不应该是个问题。如果需要一周的时间,那么每秒执行大约200万条If语句,听起来速度相当快。我想知道即使整个循环是用C编写的,它也会快多少?它可能不会改变执行时间,但是-您可以重构逻辑语句中的术语:
    如果I[0]==j[0]和I[1]==j[1]和((jdx>idx和I[2]==j[2])或(j[3].split()[0]如果j[3],split()[0]如果j[3].split else''在I[3]))
    通过在正确的范围内生成索引来避免这种情况:jdx>idx。这将节省一些浪费的时间。shift允许您将整个数组与移位的行进行比较,您可以使用numpy或pandas快速完成所做的操作,例如,您可以获取数据的一部分(导入numpy或pandas)然后使用您的标准筛选它们,因为您所做的只是在arhuaco连续3次的rowsGood搜索之间寻找匹配项。如果您执行“对于idx,枚举中的i(大[:500000]):对于jdx,枚举中的j(大[idx:]):”您将减少迭代次数。