2017-08-30 53 views
0

我需要儘可能地改進下面定義的函數的性能。它被稱爲數百萬次,並且for循環目前是我的代碼的瓶頸。用numpy.random.uniform快速填充數組

def func(d): 
    d_arr = [] 
    for rN in d: 
     d_arr.extend(np.random.uniform(rN[0], rN[1], rN[2])) 

    return np.asarray(d_arr) 

d = [[0.01, 0.11, 3413], [0.11, 0.21000000000000002, 1305], [0.21000000000000002, 0.31000000000000005, 675], [0.31000000000000005, 0.41000000000000003, 439], [0.41000000000000003, 0.51000000000000012, 318], [0.51000000000000012, 0.6100000000000001, 221], [0.6100000000000001, 0.71000000000000008, 151], [0.71000000000000008, 0.81000000000000016, 109], [0.81000000000000016, 0.91000000000000014, 82], [0.91000000000000014, 1.0100000000000002, 64], [1.0100000000000002, 1.1100000000000003, 51], [1.1100000000000003, 1.2100000000000004, 41], [1.2100000000000004, 1.3100000000000003, 34], [1.3100000000000003, 1.4100000000000004, 28], [1.4100000000000004, 1.5100000000000005, 24], [1.5100000000000005, 1.6100000000000003, 21], [1.6100000000000003, 1.7100000000000004, 18], [1.7100000000000004, 1.8100000000000005, 16], [1.8100000000000005, 1.9100000000000004, 14], [1.9100000000000004, 2.0100000000000002, 12], [2.0100000000000002, 2.1100000000000003, 11], [2.1100000000000003, 2.2100000000000004, 10], [2.2100000000000004, 2.3100000000000005, 9], [2.3100000000000005, 2.4100000000000001, 8], [2.4100000000000001, 2.5100000000000002, 7], [2.5100000000000002, 2.6100000000000003, 7], [2.6100000000000003, 2.7100000000000004, 6], [2.7100000000000004, 2.8100000000000005, 6], [2.8100000000000005, 2.9100000000000006, 5], [2.9100000000000006, 3.0100000000000002, 5], [3.0100000000000002, 3.1100000000000003, 4], [3.1100000000000003, 3.2100000000000004, 4], [3.2100000000000004, 3.3100000000000005, 4], [3.3100000000000005, 3.4100000000000006, 4], [3.4100000000000006, 3.5100000000000007, 3], [3.5100000000000007, 3.6100000000000008, 3], [3.6100000000000008, 3.7100000000000004, 3], [3.7100000000000004, 3.8100000000000005, 3], [3.8100000000000005, 3.9100000000000006, 3], [3.9100000000000006, 4.0100000000000007, 2], [4.0100000000000007, 4.1100000000000012, 2], [4.1100000000000012, 4.2100000000000009, 2], [4.2100000000000009, 4.3100000000000014, 2], [4.3100000000000014, 4.410000000000001, 2], [4.410000000000001, 4.5100000000000016, 2], [4.5100000000000016, 4.6100000000000012, 2], [4.6100000000000012, 4.7100000000000009, 2], [4.7100000000000009, 4.8100000000000014, 2], [4.8100000000000014, 4.910000000000001, 2], [4.910000000000001, 5.0100000000000016, 1], [5.0100000000000016, 5.1100000000000012, 1], [5.1100000000000012, 5.2100000000000017, 1], [5.2100000000000017, 5.3100000000000014, 1], [5.3100000000000014, 5.410000000000001, 1], [5.410000000000001, 5.5100000000000016, 1], [5.5100000000000016, 5.6100000000000012, 1], [5.6100000000000012, 5.7100000000000017, 1], [5.7100000000000017, 5.8100000000000014, 1], [5.8100000000000014, 6.0100000000000016, 2], [6.0100000000000016, 6.2100000000000017, 2], [6.2100000000000017, 6.4100000000000019, 2], [6.4100000000000019, 6.6100000000000012, 2], [6.6100000000000012, 6.8100000000000014, 1], [6.8100000000000014, 7.0100000000000016, 1], [7.0100000000000016, 7.2100000000000017, 1], [7.2100000000000017, 7.4100000000000019, 1], [7.4100000000000019, 7.6100000000000021, 1], [7.6100000000000021, 7.8100000000000014, 1], [7.8100000000000014, 8.1100000000000012, 1], [8.1100000000000012, 8.4100000000000019, 1], [8.4100000000000019, 8.7100000000000009, 1], [8.7100000000000009, 9.0100000000000016, 1], [9.0100000000000016, 9.3100000000000005, 1], [9.3100000000000005, 9.7100000000000009, 1], [9.7100000000000009, 10.110000000000001, 1], [10.110000000000001, 10.510000000000002, 1], [10.510000000000002, 11.010000000000002, 1], [11.010000000000002, 11.510000000000002, 1], [11.510000000000002, 12.110000000000001, 1], [12.110000000000001, 12.710000000000003, 1], [12.710000000000003, 13.410000000000002, 1], [13.410000000000002, 14.210000000000003, 1], [14.210000000000003, 15.110000000000003, 1], [15.110000000000003, 16.110000000000003, 1], [16.110000000000003, 17.310000000000002, 1], [17.310000000000002, 18.710000000000004, 1], [18.710000000000004, 20.410000000000004, 1], [20.410000000000004, 22.410000000000004, 1], [22.410000000000004, 24.910000000000004, 1], [24.910000000000004, 28.210000000000004, 1], [28.210000000000004, 32.710000000000008, 1], [32.710000000000008, 39.210000000000008, 1], [39.210000000000008, 49.710000000000008, 1], [49.710000000000008, 70.210000000000008, 1], [70.210000000000008, 133.41000000000005, 1]] 

for _ in range(10000): 
    d_arr = func(d) 

我已經試過:

d = np.array(d).T 
d_arr = np.random.uniform(d[0], d[1], d[2]) 

,但它失敗:

ValueError: sequence too large; cannot be greater than 32 
+0

將作業的4個段拆分爲4個線程? – pointerless

+0

我需要在代碼級別進行改進,而不是並行處理。 – Gabriel

+0

這個函數被稱爲數百萬次的事實已經是一個警告信號;你可能想要改變它。 – user2357112

回答

4

而是在循環中使用np.random.uniform,在一個np.random.random呼叫,然後產生足夠的隨機數按比例縮放:

# Could be lows, highs, counts = np.array(d).T, except for the mixed dtypes. 
# Taking input as 3 arrays of lows, highs, counts would let you skip this step. 
lows, highs, counts = zip(*d) if len(d) else ((),(),()) 

base = np.repeat(lows, counts) 
scale = np.repeat(highs, counts) - base 

random_nums = np.random.random(np.sum(counts)) * scale + base 

(除了在循環中調用np.random.uniform之外,減慢原始值的一個因素是帶有NumPy數組的列表。這會爲數組的每個元素生成包裝對象,這是一個緩慢且不必要的過程。)

+0

對不起,我不知道我是如何忘記標記這個答案爲接受。謝謝! – Gabriel

+1

我認爲在縮放時出現錯誤。它不應該是'(規模 - 基礎)'嗎? – Gabriel

+1

@ Gabriel:哎呦,修正了。 (您可以在重複之前減去一些時間。) – user2357112