Python 如何并行实现一个列表复制到另外一个列表

2019-01-08 12:25:04 +08:00
 xiaotiange

有这么一个需求:需要从一个列表中( inx )查找数据的下标(inx_),然后根据下标从一个列表( pserver )复制到另外一个列表(parameters),由于 ndown 的值非常的大,循环过程很慢

for elmn in range(ndown):
    inx_ = inx[elmn - ndown]
    parameters[inx_] = pserver[inx_]

我考虑了多线程,但是实验效果对于 cpu 密集型的计算不是很大。 多进程也试了一下,提升也不是很大。 请问,有什么好的方法提升这个速度

2634 次点击
所在节点    Python
15 条回复
hxse
2019-01-08 12:30:12 +08:00
复制??
为什么不用切片
congeec
2019-01-08 12:42:02 +08:00
这是把 python 当 C 用了
一楼说的对
条件允许的话用 numpy.array 会更快
imn1
2019-01-08 13:09:21 +08:00
1.实测(洋人实测,不是我),在列表比较大时,列表表达式比 for 循环快
建议把语句写到 fun,用[fun(x) for x in list]
2.不知道你这是举例还是正式的语句,第一句可以省略吧?改改 start/end,inx_就出来了,不必算
3.用 numpy/pandas 按条件提取很快的
xiaotiange
2019-01-08 13:15:20 +08:00
@hxse 不是整块复制,需要检索下标,对应复制
crazycabbage
2019-01-08 13:29:16 +08:00
```
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([6,7,8,9,10])
b[[0,2,4]] = a[[0,2,4]]

In [11]: b
Out[11]: array([1, 7, 3, 9, 5])
```
xpresslink
2019-01-08 13:38:59 +08:00
楼主一定是不太了解 Python 的切片有多方便。
>>> a = [0,0,0,0,0,0]
>>> b = [1,2,3,4,5,6,7,8,9]
>>> a[2:5] = b[4:7]
>>> a
[0, 0, 5, 6, 7, 0]
>>>
apoclast
2019-01-08 16:07:32 +08:00
如果 ndown 很大, 我觉得可以尝试用 n 个线程构建 n 个 list, 然后使用 extend 的方式再构建新的 list 将之前的数个 array 拼接起来. 因为不是很确定 extend 内部的实现, 因此不是特别清楚这个是否有效
gaoan000
2019-01-08 16:21:09 +08:00
@xpresslink 我觉得楼主会用到多线程就不应该不会切片,估计是别的地方
Gakho
2019-01-08 16:28:51 +08:00
不知道楼主的多进程时怎么用的?能不能用 GIST 贴一下代码
xpresslink
2019-01-08 16:43:53 +08:00
@gaoan000 嗯,从楼短短的几行 Python 代码来看,估计楼主会用 java 的多线程 /doge/
Yuanoung
2019-01-08 16:48:18 +08:00
可以试下循环展开
Aliencn
2019-01-08 21:19:33 +08:00
数据量太多我一般就用数据库了,不在 python 的内存里折腾了
lrxiao
2019-01-09 05:06:00 +08:00
这是想要 MPI OpenMP 那种自动向量化吗,numpy numba cython 什么的搞吧
lrxiao
2019-01-09 05:06:45 +08:00
你多进程怎么搞的...
lovezww2011
2019-01-22 15:57:06 +08:00
@imn1 哈哈 洋人实测

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/524939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX