【发布时间】:2023-03-20 07:05:01
【问题描述】:
来自c 的美丽世界,我正在努力理解这种行为:
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
...:
那么发生了什么?
我的猜测:python 无法理解 min(sizes) 将始终保持不变,因此在前几次调用之后替换为它的返回值..因为 Python 使用解释器..
min() 的引用没有说任何可以向我解释这件事的内容,但我在想的是它可能需要查看分区才能做到这一点,但这不应该是情况,因为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),第二个代码是O(n)。这如何支持这个假设? -
CPython 只做非常简单的优化。语言的动态特性也使得许多优化变得不可能:例如,想象一下如果其他代码做了
min = lambda x: 1。 -
我所知道的任何非纯语言都不会尝试“理解”这种优化。要使其有效,就需要确定性行为的保证。
-
我什至不相信 C 编译器会执行这种优化,更不用说 Python。优化器必须考虑太多奇怪的可能性。
-
@user2864740 对你说是因为
[1]和 [2]?
标签: c python python c performance optimization apache-spark