nombre moviles movil medias insertar data crear columnas columna cambiar agregar python performance

insertar - medias moviles python



La forma más rápida de intercambiar elementos en la lista de Python (3)

¿Hay alguna forma más rápida de intercambiar dos elementos de lista en Python que

L[a], L[b] = L[b], L[a]

¿O tendría que recurrir a Cython o Weave o algo así?


Encontré este método como la forma más rápida de intercambiar dos números:

mylist = [11,23,5,8,13,17]; first_el = mylist.pop(0) last_el = mylist.pop(-1) mylist.insert(0, last_el) mylist.append(first_el)


Parece que el compilador de Python optimiza la tupla temporal con esta construcción:

código:

import dis def swap1(): a=5 b=4 a, b = b, a def swap2(): a=5 b=4 c = a a = b b = c print ''swap1():'' dis.dis(swap1) print ''swap2():'' dis.dis(swap2)

salida:

swap1(): 6 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (a) 7 6 LOAD_CONST 2 (4) 9 STORE_FAST 1 (b) 8 12 LOAD_FAST 1 (b) 15 LOAD_FAST 0 (a) 18 ROT_TWO 19 STORE_FAST 0 (a) 22 STORE_FAST 1 (b) 25 LOAD_CONST 0 (None) 28 RETURN_VALUE swap2(): 11 0 LOAD_CONST 1 (5) 3 STORE_FAST 0 (a) 12 6 LOAD_CONST 2 (4) 9 STORE_FAST 1 (b) 13 12 LOAD_FAST 0 (a) 15 STORE_FAST 2 (c) 14 18 LOAD_FAST 1 (b) 21 STORE_FAST 0 (a) 15 24 LOAD_FAST 2 (c) 27 STORE_FAST 1 (b) 30 LOAD_CONST 0 (None) 33 RETURN_VALUE

Dos cargas, un ROT_TWO y dos ROT_TWO , frente a tres cargas y tres guardados. Es poco probable que encuentre un mecanismo más rápido.


Si pudiera publicar un ejemplo de código representativo, podríamos hacer un mejor trabajo al evaluar sus opciones. FWIW, para el siguiente punto de referencia tonto, obtengo aproximadamente una aceleración de 3x con Shed Skin y una aceleración de 10x con PyPy .

from time import time def swap(L): for i in xrange(1000000): for b, a in enumerate(L): L[a], L[b] = L[b], L[a] def main(): start = time() L = list(reversed(range(100))) swap(L[:]) print time() - start return L if __name__ == "__main__": print len(main()) # for shedskin: # shedskin -b -r -e listswap.py && make # python -c "import listswap; print len(listswap.main())"