我有一个起始数据列表。我想对起始数据应用一个函数,为起始数据中的每个元素创建一些新数据。一些新数据是相同的,我想删除它们。
顺序版本本质上是:
def create_new_data_for(datum):
"""make a list of new data from some old datum"""
return [datum.modified_copy(k) for k in datum.k_list]
data = [some list of data] #some data to start with
#generate a list of new data from the old data, we'll reduce it next
newdata = []
for d in data:
newdata.extend(create_new_data_for(d))
#now reduce the data under ".matches(other)"
reduced = []
for d in newdata:
for seen in reduced:
if d.matches(seen):
break
#so we haven't seen anything like d yet
seen.append(d)
#now reduced is finished and is what we want!
我想通过多处理来加快速度。
我在想我可以使用 multiprocessing.Queue 生成。 每个进程只是把它创建的东西放在上面,当进程减少数据时,他们可以从队列中获取数据。
但我不确定如何在没有任何竞争条件或其他问题的情况下减少和修改不同的进程循环。
安全执行此操作的最佳方法是什么?还是有其他方法可以更好地实现这个目标?
请您参考如下方法:
我会使用标准库中提供的多处理锁(类似于线程锁)。
Here's an example来自标准文档。
from multiprocessing import Process, Lock
def f(l, i):
l.acquire()
print 'hello world', i
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
为避免竞争条件,请务必在进行任何修改之前调用“mylock.acquire()”,并在完成后调用“mylock.release()”。
