Сижу оптимизирую питонокод и тихо фигею. Ниже часть выкладок (тестовых, просто смотрю как лучше тот или иной кусок сделать) от которых больше всего опух
np.zeros(5)[list(range(1,3))]
- 2.4 usnp.zeros(5)[range(1,3)]
- 5.1 us
а ведь вроде list() это плюс еще один вызов. ну это еще ладно, генераторы лучше убрать в чулан, но вот дальше
def test1():
a = np.zeros(5)
c = list(range(1,3))
for _ in range(0, 1000):
a[c] += 5
def test2():
a = np.zeros(5)
c = list(range(1,3))
for _ in range(0, 1000):
a[c] = np.add(a[c], 5)
test1()
- 4mstest2()
- 3ms (сa[c] = a[c] + 5
аналогично)
И судя по всем тестам оператор += в 90% случаев (кроме сложения целых чисел) тормознее чем тупое присвоение.
Веселее только то что если предварительно сделать что-то типа npadd = np.add
, то работать оно будет еще чуть быстрее, потому что np.add
каждый раз берет сначала указатель на np
, а затем на add()
Или вот сейчас совсем вскрыло, хоть это вообще второй пузон и с быстродействием не связано:
>>> unicode(None)
u'None'