Đó là một cuộc gọi đến cộng đồng để xem liệu có ai có ý tưởng cải thiện tốc độ thực hiện tính toán MSD này hay không. Phần lớn dựa trên việc triển khai từ bài đăng trên blog này: http://damcb.com/mean-square-disp.htmlTính toán MSD tăng tốc bằng Python
Hiện tại, việc triển khai hiện tại mất khoảng 9 giây cho quỹ đạo 2D là 5 000 điểm. Nó thực sự là quá nhiều nếu bạn cần tính toán rất nhiều quỹ đạo ...
Tôi không cố gắng song song nó (với multiprocess
hoặc joblib
) nhưng tôi có cảm giác rằng việc tạo quy trình mới sẽ quá nặng nề loại thuật toán.
Đây là mã:
import os
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Parameters
N = 5000
max_time = 100
dt = max_time/N
# Generate 2D brownian motion
t = np.linspace(0, max_time, N)
xy = np.cumsum(np.random.choice([-1, 0, 1], size=(N, 2)), axis=0)
traj = pd.DataFrame({'t': t, 'x': xy[:,0], 'y': xy[:,1]})
print(traj.head())
# Draw motion
ax = traj.plot(x='x', y='y', alpha=0.6, legend=False)
# Set limits
ax.set_xlim(traj['x'].min(), traj['x'].max())
ax.set_ylim(traj['y'].min(), traj['y'].max())
Và kết quả:
t x y
0 0.000000 -1 -1
1 0.020004 -1 0
2 0.040008 -1 -1
3 0.060012 -2 -2
4 0.080016 -2 -2
def compute_msd(trajectory, t_step, coords=['x', 'y']):
tau = trajectory['t'].copy()
shifts = np.floor(tau/t_step).astype(np.int)
msds = np.zeros(shifts.size)
msds_std = np.zeros(shifts.size)
for i, shift in enumerate(shifts):
diffs = trajectory[coords] - trajectory[coords].shift(-shift)
sqdist = np.square(diffs).sum(axis=1)
msds[i] = sqdist.mean()
msds_std[i] = sqdist.std()
msds = pd.DataFrame({'msds': msds, 'tau': tau, 'msds_std': msds_std})
return msds
# Compute MSD
msd = compute_msd(traj, t_step=dt, coords=['x', 'y'])
print(msd.head())
# Plot MSD
ax = msd.plot(x="tau", y="msds", logx=True, logy=True, legend=False)
ax.fill_between(msd['tau'], msd['msds'] - msd['msds_std'], msd['msds'] + msd['msds_std'], alpha=0.2)
Và kết quả:
msds msds_std tau
0 0.000000 0.000000 0.000000
1 1.316463 0.668169 0.020004
2 2.607243 2.078604 0.040008
3 3.891935 3.368651 0.060012
4 5.200761 4.685497 0.080016
Và một số hồ sơ:
%timeit msd = compute_msd(traj, t_step=dt, coords=['x', 'y'])
Give này:
1 loops, best of 3: 8.53 s per loop
Bất kỳ ý tưởng?
Vì bạn đã có mã làm việc, đây có thể là một ứng cử viên tốt cho * codereview *. – cel
Ồ, tôi không biết _codereview_. Người kiểm duyệt có thể xác nhận điều này và tôi sẽ chuyển nó đến _codereview_ không? – HadiM
Tôi là người kiểm duyệt trên Đánh giá mã và tôi đã gắn cờ câu hỏi này để di chuyển sang Đánh giá mã. Tất cả những gì chúng ta có thể làm là chờ xem liệu người kiểm duyệt Stack Overflow có đồng ý với điều đó không. –