Почему доступ к данным pandas, кажется, работает в 1000 раз медленнее, когда он выполняется внутри eval()
?
Пример :
import pandas as pd
import numpy as np
import time
df = pd.DataFrame(np.array([[1, 2, 3]]), columns=['a', 'b', 'c'])
Без eval():
tic = time.perf_counter()
for i in range(100):
df['a']
toc = time.perf_counter()
print(f"Executed in {toc - tic:0.4f} seconds")
#Executed in 0.0002 seconds
Использование pd.eval:
tic = time.perf_counter()
for i in range(100):
pd.eval("df['a']")
toc = time.perf_counter()
print(f"Executed in {toc - tic:0.4f} seconds")
#Executed in 0.9919 seconds
Использование loc
и iloc
не имеет значения.
Производительность также в значительной степени то же самое при доступе к большему количеству элементов.
df['a'] + df['b']
- 0,0115 секунды против 1,8803 секунды df['a'] + df['b']+ df['c']
- 0,0259 секунды против 3,0085 секунды
Использование eval()
непосредственно во фрейме данных, например df.eval('a = b + c')
, делает его всего в 3-4 раза медленнее, чем версия без eval (в отличие от 100-1000 раз медленнее), но исходный вопрос остается.