繁体   English   中英

如何有效地填充 np.array?

[英]How to efficiently fill a np.array?

我尝试将数据填充到一个 numpy 数组中。 然而,对于更高的索引,它需要越来越多的时间。 为什么?

我怎样才能防止这种情况? 我已经在最终维度中创建了数组...

import random
import numpy as np

# p = [ ... 2200 values in a python list ... ]

iterations = 1000
max_draws = len(p)-1

percentiles = np.zeros(max_draws)
money_list = np.zeros(iterations)

invest = 100
for k in range(1,max_draws):
    print(k)
    for j in range(0,iterations):
        money_list[j] = (invest * np.random.choice(p, k)).sum()

    percentiles[k] = np.percentile(money_list, 5)

我有一个代表股票市场交易收益的因子p列表。 现在我想知道我必须进行多少笔交易(从可能的交易列表中获取),以便以 95% 的概率赚钱而不赔钱(假设我进行所有交易,我赚钱而不是赔钱)失去它)。

毕竟提出了改进建议,还可以进行另一项非常有效的改进。

如果您不介意安装和使用非常重的额外 python pip 包numba (通过python -m pip install numba ),那么您可以显着提高速度,就像在下一个代码中一样。

Numba 旨在将 Python 的函数预编译为高效的机器代码,也旨在与NumPy一起使用。 它将 python 循环转换为快速C代码并使用LLVM编译它。

下一个代码在2199次外循环迭代中实现了4.18x倍的加速,就像在您的代码中一样,并且在 5-20 次迭代中实现了100x倍的加速。 使用 Numba 的案例的所有 2199 次迭代都在我的慢速 PC 上在 90 秒内完成。

也可以在线尝试下一个代码!

# Needs: python -m pip install numpy numba
import random, numpy as np, numba, timeit

p = np.random.random((2200,)) # or do p = np.array(p) if p is a list

iterations = 1000
max_draws = len(p) - 1

invest = 100

def do_regular(hi):
    percentiles = np.zeros(max_draws)
    money_list = np.zeros(iterations)

    for k in range(1, hi):
        for j in range(0,iterations):
            money_list[j] = (invest * np.random.choice(p, k)).sum()

        percentiles[k] = np.percentile(money_list, 5)
        
    return percentiles, money_list

do_numba  = numba.jit(nopython = True)(do_regular)
            
do_numba(2) # Pre-compile, heat up
for hi in [8, 16, 32, 64, 128, 256, 512, max_draws]: #max_draws
    tr = timeit.timeit(lambda: do_regular(hi), number = 1)
    tn = timeit.timeit(lambda: do_numba(hi), number = 1)
    print(str(hi).rjust(4), 'regular', round(tr, 3), 'sec')
    print(str(hi).rjust(4), 'numba', round(tn, 3), 'sec, speedup', round(tr / tn, 2), flush = True)

输出:

   8 regular 0.604 sec
   8 numba 0.005 sec, speedup 131.2
  16 regular 1.296 sec
  16 numba 0.013 sec, speedup 101.36
  32 regular 2.672 sec
  32 numba 0.034 sec, speedup 78.18
  64 regular 5.515 sec
  64 numba 0.113 sec, speedup 48.87
 128 regular 11.3 sec
 128 numba 0.374 sec, speedup 30.19
 256 regular 23.758 sec
 256 numba 1.35 sec, speedup 17.59
 512 regular 51.767 sec
 512 numba 5.086 sec, speedup 10.18
2199 regular 376.327 sec
2199 numba 90.104 sec, speedup 4.18

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM