【发布时间】:2014-11-15 01:11:10
【问题描述】:
对于从列表src_list到dest_list的map任务,len(src_list)是千级:
def my_func(elem):
# some complex work, for example a minimizing task
return new_elem
dest_list[i] = my_func(src_list[i])
我使用 multiprocessing.Pool
pool = Pool(4)
# took 543 seconds
dest_list = list(pool.map(my_func, src_list, chunksize=len(src_list)/8))
# took 514 seconds
dest_list = list(pool.map(my_func, src_list, chunksize=4))
# took 167 seconds
dest_list = [my_func(elem) for elem in src_list]
我很困惑。有人可以解释为什么多处理版本运行得更慢吗?
我想知道选择chunksize和选择之间的考虑是什么 多线程和多进程,尤其是对于我的问题。另外,目前,我测量时间 由于直接使用了在 my_func 方法中花费的所有时间
t = time.time()
dest_list = pool.map...
print time.time() - t
不起作用。但是,在here 中,文档说 map() 阻塞直到结果准备好,这似乎与我的结果不同。除了简单地总结时间之外,还有其他方法吗?我尝试了 pool.close() 和 pool.join(),但它不起作用。
src_list 的长度约为 2000。time.time()-t 不起作用,因为它没有总结 pool.map 中 my_func 所花费的所有时间。当我使用 timeit 时发生了奇怪的事情。
def wrap_func(src_list):
pool = Pool(4)
dest_list = list(pool.map(my_func, src_list, chunksize=4))
print timeit("wrap_func(src_list)", setup="import ...")
遇到了
OS Error Cannot allocate memory
我猜我用错了timeit...
我在 Ubuntu 14.04 下使用 python 2.7.6。
谢谢!
【问题讨论】:
-
src_list有多大?它里面的数据结构有多大? -
另外,我不确定你说使用
t = time.time() ; printtime.time() = t` 不起作用是什么意思。什么不完全有效? -
关于时间测量,可以使用timeit模块。
-
timeit 不适用于我的情况,或者我用错了。我已经更新了我的问题。