代码之家  ›  专栏  ›  技术社区  ›  user3152377

Python:矢量化/广播会提高速度吗?

  •  1
  • user3152377  · 技术社区  · 6 年前

    目标: 将数组p1合并到p10以创建一个名为“a”的大型数组,并返回“a”中出现的所有值,4次。

    问题: 这段代码非常慢,因为所有的循环都需要完成,我怎样才能使它更快?矢量化和/或广播是否有助于提高效率(是否有可能消除所有循环)?或者其他任何关于快速性的现成想法?

    import numpy as np
    import itertools
    from numba import jit
    
    p1 = np.random.randint(0,314000,200000)
    p2 = np.random.randint(0,314000,100000)
    p3 = np.random.randint(0,314000,300000)
    p4 = np.random.randint(0,314000,150000)
    p5 = np.random.randint(0,314000,220000)
    p6 = np.random.randint(0,314000,320000)
    p7 = np.random.randint(0,314000,212100)
    p8 = np.random.randint(0,314000,100500)
    p9 = np.random.randint(0,314000,300700)
    p10 = np.random.randint(0,314000,200300)
    
    @jit
    def count(a,n):
     counters=np.zeros(10**6,np.int32)
     for i in a:
      counters[i] += 1
     res=np.empty_like(counters)
     k = 0    
     for i,j in enumerate(counters):
      if j == n:
       res[k] = i
       k += 1
     return res[:k]        
    
    
    for t in range(0, 20000):
     a = itertools.chain(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
     count(a,4)
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Paul Panzer    6 年前

    是的,是的。您可以摆脱循环,它将加快速度:

    >>> a = np.concatenate([p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
    >>> np.flatnonzero(np.bincount(a, minlength=314000)==4)
    array([    29,     33,     38, ..., 313944, 313949, 313973])