¿Cuál es la forma más independiente de la plataforma y la versión de Python para hacer un bucle rápido para usar en Python?

Estoy escribiendo una aplicación científica en Python con un ciclo de procesador muy intensivo en su núcleo. Me gustaría optimizar esto en la medida de lo posible, con el mínimo inconveniente para los usuarios finales, que probablemente lo usarán como una colección no compilada de scripts de Python y usarán Windows, Mac y (principalmente Ubuntu) Linux.

Actualmente está escrito en Python con una pizca de NumPy, y he incluido el código a continuación.

¿Existe una solución que sea razonablemente rápida que no requiera compilación? Esta parece ser la forma más fácil de mantener la independencia de la plataforma.Si usa algo como Pyrex, que requiere compilación, ¿hay una manera fácil de agrupar muchos módulos y hacer que Python elija entre ellos dependiendo del sistema operativo detectado y la versión de Python? ¿Hay una manera fácil de construir la colección de módulos sin necesidad de acceder a todos los sistemas con cada versión de Python?¿Se presta un método en particular para la optimización multiprocesador?

(Si está interesado, el ciclo consiste en calcular el campo magnético en un punto dado dentro de un cristal sumando las contribuciones de una gran cantidad de iones magnéticos cercanos, tratados como pequeños imanes de barra. Básicamente, una suma masiva deestas.)

# calculate_dipole
# -------------------------
# calculate_dipole works out the dipole field at a given point within the crystal unit cell
# ---
# INPUT
# mu = position at which to calculate the dipole field
# r_i = array of atomic positions
# mom_i = corresponding array of magnetic moments
# ---
# OUTPUT
# B = the B-field at this point

def calculate_dipole(mu, r_i, mom_i):
    relative = mu - r_i
    r_unit = unit_vectors(relative)
    #4pi / mu0 (at the front of the dipole eqn)
    A = 1e-7
    #initalise dipole field
    B = zeros(3,float)

    for i in range(len(relative)):
        #work out the dipole field and add it to the estimate so far
        B += A*(3*dot(mom_i[i],r_unit[i])*r_unit[i] - mom_i[i]) / sqrt(dot(relative[i],relative[i]))**3
    return B

Respuestas a la pregunta(5)

Su respuesta a la pregunta