【发布时间】:2019-12-12 16:39:16
【问题描述】:
我是 Python 新手,我有一个程序可以加载一个超过 100k 行的大 CSV 文件,每行有 4 列。 在 FOR 循环中,我检查每一行是否有相同的重复列表 (dlist),这个 dlist 是我与另一个加载的 DRef 类的对象列表功能
DsRef 类:
from tqdm import tqdm
from multiprocessing import Pool, cpu_count, freeze_support
class DsRef:
def __init__(self, pn, comp, comp_name, type, diff):
self.pn = pn
self.comp = comp
self.comp_name = comp_name
self.type = type
self.diff = diff
def __str__(self):
return f'{self.pn} {get_red("|")} {self.comp} {get_red("|")} {self.comp_name} {get_red("|")} {self.type} {get_red("|")} {self.diff}\n'
def __repr__(self):
return str(self)
def __iter__(self):
return iter(self.__dict__.items())
复制类:
class Duplication:
def __init__(self, pn, comp, cnt):
self.pn = pn
self.comp = comp
self.cnt = cnt
def __str__(self):
return f'{self.pn};{self.comp};{self.cnt}\n'
def __repr__(self):
return str(self)
def __hash__(self):
return hash(('pn', self.pn,
'comp', self.comp))
def __eq__(self, other):
return self.pn == other.pn and self.comp == other.comp
加载数据文件样本进行测试:
dlist= []
dlist.append(DsRef(
"TTT_XXX", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XCX", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XXX", "CCC_VCV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XXX", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XYX", "CCC_YYY", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TAT_XQX", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"ATT_XXX", "CCC_VQV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_EEE", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XWX", "CCC_VVV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_XXX", "CCC_VWV", "CTYPE", "CTYPE", "text"))
dlist.append(DsRef(
"TTT_EEE", "CCC_VVV", "CTYPE", "CTYPE", "text"))
查找并返回重复值行的方法:
def FindDuplications(dlist):
duplicates = []
for pn, comp in enumerate(dlist):
matches = [xpn for xpn, xcomp in enumerate(dlist) if pn == xpn and comp == xcomp]
duplicates.append(Duplication(pn, comp, len(matches)))
return duplicates
row.pn == x.pn and row.comp == x.comp 如果它是真的我发现一个重复我将每个 objech 的前 2 个参数与列表中的每个对象进行比较
现在我尝试使用类似的东西来使用所有处理器以获得更快的结果,现在需要超过 15 分钟
if __name__ == '__main__':
freeze_support()
p = Pool(cpu_count())
duplicates = p.map(FindDuplications, dlist)
p.close()
p.join()
首先,当 Class 不可迭代时我得到一个错误,然后我为第一个类创建 iter 函数,之后,我得到一个错误,然后元组对象不知道 pn 或 comp 参数,然后我使用 in for enumerate(dlist) 但仍然不起作用
你能帮帮我吗?
我也想使用 TQDM 来检查处理功能的进度以查找重复
有一个不使用多线程的原始工作函数:
def CheckDuplications(dlist):
print(get_yellow("========= CHECK CROSS DUPLICATIONS ========="))
duplicates = []
for r in tqdm(dlist):
matches = [x for x in dlist if r.pn == x.pn and r.comp == x.comp]
duplicates.append(Duplication(r.pn, r.comp, len(matches)))
results = [d for d in duplicates if d.cnt > 1]
results = set(results)
return results
从函数 FindDuplications 我得到了 DsRef 对象的列表(简单副本),但这必须返回 Duplication 对象的列表,有问题
谢谢
【问题讨论】:
-
到底是什么问题?我刚刚尝试运行您的代码,它似乎至少执行得很好。输出不是你所期望的吗?
-
当我尝试运行 CheckDuplications 函数时,它工作正常,但它只使用 12 个逻辑处理器内核中的一个,当我使用 FindDuplications 时,我会喜欢使用所有逻辑核心或多个逻辑核心以获得更快的结果。当我运行多线程函数 FindDuplications 脚本在 3 秒后结束,但函数 CheckDuplications 需要超过 17 分钟,但我有超过 100k 行
-
哦,我想我遇到了你的问题。
pool.map()独立调用每个项目的给定函数。FindDuplications没有收到完整列表,也无法访问列表的其余部分以查找其他重复项。 -
顺便说一句,python约定使用snake_case作为函数,应该是
find_duplications -
好的,snake_case 会好的,但是您知道如何解决这个问题或如何解决它吗?
标签: python-3.x multithreading list