有这么一个需求:需要从一个列表中( inx )查找数据的下标(inx_),然后根据下标从一个列表( pserver )复制到另外一个列表(parameters),由于 ndown 的值非常的大,循环过程很慢
for elmn in range(ndown):
inx_ = inx[elmn - ndown]
parameters[inx_] = pserver[inx_]
我考虑了多线程,但是实验效果对于 cpu 密集型的计算不是很大。 多进程也试了一下,提升也不是很大。 请问,有什么好的方法提升这个速度
1
hxse 2019-01-08 12:30:12 +08:00
复制??
为什么不用切片 |
2
congeec 2019-01-08 12:42:02 +08:00 via iPhone
这是把 python 当 C 用了
一楼说的对 条件允许的话用 numpy.array 会更快 |
3
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 按条件提取很快的 |
4
xiaotiange OP @hxse 不是整块复制,需要检索下标,对应复制
|
5
crazycabbage 2019-01-08 13:29:16 +08:00 1
```
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]) ``` |
6
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] >>> |
8
gaoan000 2019-01-08 16:21:09 +08:00 via Android
@xpresslink 我觉得楼主会用到多线程就不应该不会切片,估计是别的地方
|
9
Gakho 2019-01-08 16:28:51 +08:00
不知道楼主的多进程时怎么用的?能不能用 GIST 贴一下代码
|
10
xpresslink 2019-01-08 16:43:53 +08:00
@gaoan000 嗯,从楼短短的几行 Python 代码来看,估计楼主会用 java 的多线程 /doge/
|
11
Yuanoung 2019-01-08 16:48:18 +08:00
可以试下循环展开
|
12
Aliencn 2019-01-08 21:19:33 +08:00
数据量太多我一般就用数据库了,不在 python 的内存里折腾了
|
13
lrxiao 2019-01-09 05:06:00 +08:00
这是想要 MPI OpenMP 那种自动向量化吗,numpy numba cython 什么的搞吧
|
14
lrxiao 2019-01-09 05:06:45 +08:00
你多进程怎么搞的...
|
15
lovezww2011 2019-01-22 15:57:06 +08:00
@imn1 哈哈 洋人实测
|