Работает ли Python-интерпретатор на лету с оптимизацией? - PullRequest
0 голосов
/ 30 октября 2018

Скажем, например, у меня есть список, и я хочу преобразовать в np.array. Хороший способ (ИМХО) будет:

my_np_array = np.reshape(my_list,(200,200))

Если бы я был действительно плохим человеком, я мог бы использовать:

my_np_array = np.array(my_list).reshape(200,200)

или даже

useless_array = np.array(my_list)
useful_array = useless_array/reshape(200,200)

Предполагая, что useless_array больше не упоминается, способен ли интерпретатор python преобразовать второе и третье утверждения в первое?

РЕДАКТИРОВАТЬ: Я думал о стандартном интерпретаторе Python 3.7, когда я задал вопрос, но мне был бы интересен любой интерпретатор / компилятор Python, способный выполнять оптимизацию.

1 Ответ

0 голосов
/ 30 октября 2018

Да и нет. Да, Python VM делает некоторые ограниченные оптимизации. Основным ограничением является то, что Python является динамическим, вы не можете оптимизировать большинство вещей впереди - в отличие от Java. Некоторые реализации более «умны», чем другие. Например, pypy выполняет JIT-компиляции, CPython выполняет некоторые низкоуровневые трюки.

Нет - python (CPython) не выполняет встраивание переменных, причина этого в том, что вы можете запустить свой скрипт с python -i non-optimized.py, и вы должны быть в состоянии достичь всех переменных. То же относится и к подключению отладчиков.

По сути, некоторые оптимизации производительности приносятся в жертву динамическому характеру, а некоторые просто еще не реализованы в реализациях.

Дополнительное замечание о ваших подходах - это та же производительность, изменение формы очень дешево и не влияет на структуру памяти. Кроме того, на самом деле, вы всегда хотите профилировать свой код, это гораздо лучше, чем теоретизировать его:

In [11]: %timeit my_np_array = np.reshape(my_list,(200,200))                                                                                                                                                       
1.92 ms ± 3.76 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [12]: %timeit my_np_array = np.array(my_list).reshape(200,200)                                                                                                                                                  
1.92 ms ± 8.01 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [13]: %timeit useless_array = np.array(my_list); useful_array = useless_array.reshape(200,200)                                                                                                                  
1.92 ms ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
...