von der schönen Welt der c kommend, ich versuche, dieses Verhalten verstehen:Ist Python intelligent genug, um Funktionsaufrufe mit konstantem Ergebnis zu ersetzen?
In [1]: dataset = sqlContext.read.parquet('indir')
In [2]: sizes = dataset.mapPartitions(lambda x: [len(list(x))]).collect()
In [3]: for item in sizes:
...: if(item == min(sizes)):
...: count = count + 1
...:
würde nicht auch nach 20 Minuten beenden, und ich weiß, dass die Liste sizes
nicht so groß ist, weniger als 205k Länge. Allerdings ausgeführt diese sofort:
In [8]: min_item = min(sizes)
In [9]: for item in sizes:
if(item == min_item):
count = count + 1
...:
Also, was ist passiert?
Meine Vermutung: python konnte nicht verstehen, dass min(sizes)
immer konstant sein wird, so dass nach den ersten paar Anrufen mit seiner Rückkehr ersetzen value..since Python das Interpreter verwendet ..
Ref von min() Doesn sage nichts, was mir die Sache erklären würde, aber was ich dachte, ist, dass es vielleicht die Partitionen dafür suchen muss, aber das sollte nicht der Fall sein, da sizes
ein list
ist , kein RDD
!
Edit:
Hier ist die Quelle meiner Verwirrung, ich ein ähnliches Programm in C geschrieben:
for(i = 0; i < SIZE; ++i)
if(i == mymin(array, SIZE))
++count;
und bekam diese Timings:
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
That took 98.679177000 seconds wall clock time.
C02QT2UBFVH6-lm:~ gsamaras$ gcc -O3 -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
That took 0.000000000 seconds wall clock time.
und für Timings habe ich Nomimal Animal Ansatz von meinem Time measurements verwendet.
Der erste Code ist 'O (n * n)', der zweite Code ist 'O (n) '. Wie unterstützt dies die Hypothese? – user2864740
CPython macht nur sehr einfache Optimierungen. Die dynamische Natur der Sprache macht auch viele Optimierungen unmöglich: Stellen Sie sich zum Beispiel vor, wenn ein anderer Code 'min = Lambda x: 1' hätte. –
Es gibt keine nicht-reine Sprache, die ich kenne, die sogar versuchen würde, diese Optimierung zu "verstehen". Um überhaupt gültig zu sein, wäre eine Garantie für deterministisches Verhalten erforderlich. – user2864740