2017-07-05 17 views
0

Ich Profilierungs das Timing eines od meiner Funktionen und ich sehe, dass ich viel Zeit auf Pandas Dataframe Schöpfung verbracht - ich etwa 2,5 Sekunden im Gespräch einen Datenrahmen mit 1000 Spalten zu konstruieren und 10k Zeilen:Wofür ist may_convert_objects gut?

def test(size): 
samples = [] 
for r in range(10000): 
    a,b = np.random.randint(100, size=2) 
    data = np.random.beta(a,b ,size = size) 
    samples.append(data) 
return DataFrame(samples, dtype = np.float64) 

Lauf %prun -l 4 test(1000) kehrt:

enter image description here

gibt es trotzdem ich diese Prüfung vermeiden kann? Dies scheint wirklich nicht versucht, über diese Methode und Möglichkeiten, hier zu umgehen, aber nichts online zu finden.

Antwort

0

Pandas müssen jede Zeile prüfen, weil sie eine Liste von Arrays übergeben. Hier sind einige effizientere Methoden in diesem Fall.

In [27]: size=1000 

In [28]: samples = [] 
    ...: for r in range(10000): 
    ...:  data = np.random.beta(1,1 ,size = size) 
    ...:  samples.append(data) 
    ...: 

In [29]: np.asarray(samples).shape 
Out[29]: (10000, 1000) 

# original 
In [30]: %timeit DataFrame(samples) 
2.29 s ± 91.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

# numpy is less flexible on the conversion, but in this case 
# it is fine 
In [31]: %timeit DataFrame(np.asarray(samples)) 
30.9 ms ± 426 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 

# you should probably just do this 
In [32]: samples = np.random.beta(1,1, size=(10000, 1000)) 

In [33]: %timeit DataFrame(samples) 
74.4 µs ± 381 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
+0

Hallo, das ist großartig! Danke vielmals. Bezüglich der letzten Option. Nun, ich kann das nicht tun, weil jedes Array aus verschiedenen a, b Parametern besteht. Ich werde die Frage so ändern, dass es klar ist. Danke noch einmal :) – idoda