Иногда я просто ненавижу использовать промежуточное ПО.Возьмем для примера: я хотел бы иметь справочную таблицу, которая отображает значения из набора входных (доменных) значений в выходные (диапазонные) значения.Отображение является уникальным.Карта Python может сделать это, но так как карта довольно большая, я решил, почему бы не использовать ps.Series и ее индекс, что дает мне дополнительное преимущество:
- передать несколько значений вотображаться как серия (надеюсь, быстрее, чем поиск по словарю)
- индекс исходного ряда сохраняется в результате
примерно так:
domain2range = pd.Series(allrangevals, index=alldomainvals)
# Apply the map
query_vals = pd.Series(domainvals, index=someindex)
result = query_vals.map(domain2range)
assert result.index is someindex # Nice
assert (result.values in allrangevals).all() # Nice
Работаеткак и ожидалось.Но нет.Стоимость времени .map увеличивается с len(domain2range)
не (более разумно) O(len(query_vals))
, как можно показать:
numiter = 100
for n in [10, 1000, 1000000, 10000000,]:
domain = np.arange(0, n)
range = domain+10
maptable = pd.Series(range, index=domain).sort_index()
query_vals = pd.Series([1,2,3])
def f():
query_vals.map(maptable)
print n, timeit.timeit(stmt=f, number=numiter)/numiter
10 0.000630810260773
1000 0.000978469848633
1000000 0.00130645036697
10000000 0.0162791204453
facepalm .При n = 10000000 его (0,01 / 3) секунды на отображаемое значение.
Итак, вопросы:
- Series.map , как ожидается, будет вести себя так?Почему это так смехотворно медленно?Я думаю Я использую его, как показано в документации.
- есть быстрый способ использовать панд для поиска в таблице.Похоже на вышесказанное не так ли?