У меня есть большое количество файлов, которые содержат данные из моделирования. Я хочу использовать каждый файл для сохранения изображения векторного поля с помощью quiver (). К сожалению, мой метод очень медленный.
Вот минимальный рабочий пример моего кода:
import time
import numpy as np
import matplotlib.pyplot as plt
# Number of files
N = 100000
n_points = 10000
for k in range(N):
t0 = time.time()
fig, ax = plt.subplots(1,1, figsize=(5,5))
ax.axis("off")
# Get data
data = np.random.uniform(-1,1,size=(n_points, 4))
x,y,vx,vy = data[:,0], data[:,1], data[:,2], data[:,3]
# Normalize and scale velocities
norm = np.hypot(vx,vy)
vx = vx / norm
vy = vy / norm
vx *= 0.05
vy *= 0.05
# Plot vectorfield
ax.quiver(x, y, vx, vy, scale=1., width=0.001, units="xy")
plt.subplots_adjust(bottom=0, right=1, top=1, left=0)
plt.savefig("image_" + str(k) + ".png", dpi=300)
plt.close()
print("%.2f" % (100.*(k+1.)/N) + " %" + " %.2f" % (time.time()-t0) + " images/s", end="\r")
Есть идеи, как мне ускорить процесс? Прямо сейчас я могу сохранять около одного изображения каждую секунду. Учитывая большое количество файлов данных, на моем компьютере это может занять несколько часов.
Спасибо!
EDIT
Я изменил приведенный выше код в соответствии с рекомендациями @ImportanceOfBeingErnest. Тем не менее, код по-прежнему очень медленно.
import time
import numpy as np
import matplotlib.pyplot as plt
# Number of files
N = 20
n_points = 20000
fig, ax = plt.subplots(1,1, figsize=(5,5))
ax.axis("off")
plt.subplots_adjust(bottom=0, right=1, top=1, left=0)
for k in range(N):
t0 = time.time()
# Get data
data = np.random.uniform(-1,1,size=(n_points, 4))
x,y,vx,vy = data[:,0], data[:,1], data[:,2], data[:,3]
# Normalize and scale velocities
norm = np.hypot(vx,vy)
vx = vx / norm
vy = vy / norm
vx *= 0.05
vy *= 0.05
# Plot vectorfield
q = ax.quiver(x, y, vx, vy, scale=1., width=0.001, units="xy")
plt.savefig("image_" + str(k) + ".png", dpi=300)
#q.remove()
ax.clear()
#plt.close()
t.append(time.time()-t0)
print("%.2f" % (100.*(k+1.)/N) + " %" + " %.2f" % (time.time()-t0) + " s/images", end="\r")
До каких-либо улучшений на одно изображение в среднем уходило около 1,71 секунды. Использование ax.clear()
еще медленнее - 1,81 секунды на изображение. Использование q.remove()
немного быстрее и дает 1,61 секунды на изображение. Есть еще предложения?