V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xiaotiange
V2EX  ›  Python

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

  •  
  •   xiaotiange · 2019-01-08 12:25:04 +08:00 · 2852 次点击
    这是一个创建于 2173 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    15 条回复    2019-01-22 15:57:06 +08:00
    hxse
        1
    hxse  
       2019-01-08 12:30:12 +08:00
    复制??
    为什么不用切片
    congeec
        2
    congeec  
       2019-01-08 12:42:02 +08:00 via iPhone
    这是把 python 当 C 用了
    一楼说的对
    条件允许的话用 numpy.array 会更快
    imn1
        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 按条件提取很快的
    xiaotiange
        4
    xiaotiange  
    OP
       2019-01-08 13:15:20 +08:00 via Android
    @hxse 不是整块复制,需要检索下标,对应复制
    crazycabbage
        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])
    ```
    xpresslink
        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]
    >>>
    gaoan000
        8
    gaoan000  
       2019-01-08 16:21:09 +08:00 via Android
    @xpresslink 我觉得楼主会用到多线程就不应该不会切片,估计是别的地方
    Gakho
        9
    Gakho  
       2019-01-08 16:28:51 +08:00
    不知道楼主的多进程时怎么用的?能不能用 GIST 贴一下代码
    xpresslink
        10
    xpresslink  
       2019-01-08 16:43:53 +08:00
    @gaoan000 嗯,从楼短短的几行 Python 代码来看,估计楼主会用 java 的多线程 /doge/
    Yuanoung
        11
    Yuanoung  
       2019-01-08 16:48:18 +08:00
    可以试下循环展开
    Aliencn
        12
    Aliencn  
       2019-01-08 21:19:33 +08:00
    数据量太多我一般就用数据库了,不在 python 的内存里折腾了
    lrxiao
        13
    lrxiao  
       2019-01-09 05:06:00 +08:00
    这是想要 MPI OpenMP 那种自动向量化吗,numpy numba cython 什么的搞吧
    lrxiao
        14
    lrxiao  
       2019-01-09 05:06:45 +08:00
    你多进程怎么搞的...
    lovezww2011
        15
    lovezww2011  
       2019-01-22 15:57:06 +08:00
    @imn1 哈哈 洋人实测
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.