は、私は、この動作を理解しようとしています:pythonはスマートなので、関数呼び出しを定数に置き換えることができますか? <a href="/questions/tagged/c" class="post-tag" title="show questions tagged 'c'" rel="tag">c</a>の美しい世界から来る
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
...:
はでも20 分後に完了していないだろう、と私は、リストsizes
がより少なく、その大きなではないことを知っています長さ205k。しかし、これは瞬時にを実行:
In [8]: min_item = min(sizes)
In [9]: for item in sizes:
if(item == min_item):
count = count + 1
...:
だから何が起こったのか?
私の推測:min()のdoesnのpythonは、このように、min(sizes)
は常に一定であることを理解Pythonのインタプリタを使用していますvalue..sinceそのリターンとの最初の数のコールの後に置き換えることができませんでした。..
文献この問題を私に説明するものは何も言いませんが、私が考えているのは、それを行うにはパーティションを見る必要があるかもしれないということです。しかし、そうであってはいけません。sizes
はlist
、ないRDD
!
編集:ここでは
は私の混乱の源である、私はCで同様のプログラムを書いた:
for(i = 0; i < SIZE; ++i)
if(i == mymin(array, SIZE))
++count;
をし、これらのタイミングだ:
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.
をし、タイミングのために、Time measurementsからNomimal Animalのアプローチを使用しました。
最初のコードは 'O(n * n)'、2番目のコードは 'O(n)'です。これはどのようにして仮説を支持するのでしょうか? – user2864740
CPythonは本当に単純化された最適化しか行いません。言語の動的性質によって、多くの最適化が不可能になります。たとえば、他のコードが 'min = lambda x:1'を実行したとします。 –
私はこの最適化を "理解する"ことさえ知っている非純粋な言語はありません。それが有効であっても、決定論的な振る舞いの保証が必要です。 – user2864740