Я озадачен разницей в производительности следующих двух семантически эквивалентных (?) Программ.
Python:
#test.py
import time
starttime=time.time()
import tensorflow
print(f"Import took: {time.time() - starttime}")
C с использованием CPython
//test.c
#include <Python.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
Py_Initialize();
clock_t t = clock();
PyObject* pModule = PyImport_ImportModule("tensorflow");
double time_taken = ((double)clock() - t)/CLOCKS_PER_SEC;
printf("Import took: %f\n", time_taken);
return 0;
}
Теперь сравните их:
cl.exe /I"C:\Program Files\Python37\include" test.c
link test.obj python37.lib /LIBPATH:"C:\Program Files\Python37\libs"
.\test.exe
2020-04-17 13: 00: 51.598550: W tensflowflow / stream_executor / platform / default / dso_loader. cc: 55] Не удалось загрузить динамическую c библиотеку 'cudart64_100.dll'; dlerror: cudart64_100.dll не найден.
Импорт занял: 23.160523891448975
python test.py
2020-04-17 13: 01: 19.525648: W tenorflow / stream_executor / platform / default /dso_loader.cc:55] Не удалось загрузить Dynami c библиотека 'cudart64_100.dll'; dlerror: cudart64_100.dll не найден.
Импорт занял: 2.3172824382781982
Не то, чтобы это имело большое значение, но моя версия тензорного потока равна 1.15 Почему код виртуальной машины python намного быстрее, чем скомпилированный CPython код? python vm добавляет магию c, которую PyImport_ImportModule не делает?