Đến từ thế giới xinh đẹp của c, tôi đang cố gắng tìm hiểu hành vi này:Có phải python đủ thông minh để thay thế các cuộc gọi chức năng với kết quả không đổi?
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
...:
sẽ không thậm chí kết thúc sau 20 phút, và tôi biết rằng danh sách sizes
không phải là lớn, ít hơn 205k chiều dài. Tuy nhiên, điều này được thực hiện ngay lập tức:
In [8]: min_item = min(sizes)
In [9]: for item in sizes:
if(item == min_item):
count = count + 1
...:
Vậy điều gì đã xảy ra?
tôi đoán: python không thể hiểu rằng min(sizes)
sẽ luôn không đổi, do đó thay thế sau vài cuộc gọi đầu tiên với sự trở lại của mình value..since Python sử dụng thông dịch viên ..
Ref của min() doesn không nói bất cứ điều gì sẽ giải thích vấn đề với tôi, nhưng những gì tôi nghĩ là nó có thể cần phải nhìn vào các phân vùng để làm điều đó, nhưng đó không phải là trường hợp, vì sizes
là list
, không phải là RDD
!
Edit:
Đây là nguồn gốc của sự nhầm lẫn của mình, tôi đã viết một chương trình tương tự trong C:
for(i = 0; i < SIZE; ++i)
if(i == mymin(array, SIZE))
++count;
và có những 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.
và cho timings, tôi đã sử dụng phương pháp của Nomimal Animal từ số Time measurements.
Mã đầu tiên là 'O (n * n)', mã thứ hai là 'O (n)'. Điều này hỗ trợ giả thuyết như thế nào? – user2864740
CPython chỉ thực sự tối ưu hóa đơn giản. Bản chất động của ngôn ngữ cũng làm cho nhiều tối ưu hóa không thể: ví dụ, hãy tưởng tượng nếu một số mã khác đã làm 'min = lambda x: 1'. –
Không có ngôn ngữ không thuần túy mà tôi biết rằng thậm chí sẽ cố gắng "hiểu" tối ưu hóa này. Đối với nó thậm chí còn hợp lệ sẽ yêu cầu một đảm bảo về hành vi xác định. – user2864740