Ich schreibe eine wissenschaftliche Anwendung in Python mit einer sehr prozessorintensiven Schleife als Kernstück. Ich möchte diese Anwendung so weit wie möglich optimieren und dabei die Unannehmlichkeiten für die Endbenutzer so gering wie möglich halten. Diese werden sie wahrscheinlich als unkompilierte Sammlung von Python-Skripten verwenden und Windows, Mac und (hauptsächlich Ubuntu) Linux einsetzen.
Es ist derzeit in Python mit einem Hauch von NumPy geschrieben, und ich habe den Code unten eingefügt.
- Gibt es eine Lösung, die einigermaßen schnell ist und keine Kompilierung erfordert? Dies scheint der einfachste Weg zu sein, um die Plattformunabhängigkeit zu erhalten.
- Wenn Sie etwas wie Pyrex verwenden, die Kompilierung erfordert, gibt es eine einfache Möglichkeit, viele Module zu bündeln und haben Python wählen zwischen ihnen je nach erkannten OS und Python-Version? Gibt es eine einfache Möglichkeit, eine Sammlung von Modulen zu erstellen, ohne dass man Zugang zu jedem System mit jeder Python-Version benötigt?
- Eignet sich eine Methode besonders gut für die Optimierung mit mehreren Prozessoren?
(Falls es Sie interessiert: Die Schleife besteht darin, das Magnetfeld an einem bestimmten Punkt in einem Kristall zu berechnen, indem man die Beiträge einer großen Anzahl von nahegelegenen magnetischen Ionen addiert, die als winzige Stabmagnete behandelt werden. Im Grunde genommen wird eine riesige Summe von diese .)
# 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