এখানে একটি শুরু। প্রথমত, কোনও ভুলের জন্য আমার ক্ষমা চাই।
আমিi - 1
সম্পাদনা: না, প্রশ্নের উপরের হিসাবে উপরের সীমাটি সঠিক ছিল। আমি এটি এখানে যেমন রেখেছি কারণ অন্য উত্তর এখন একই কোড ব্যবহার করে তবে ফিক্সটি সহজ।
প্রথমে একটি লুপ করা সংস্করণ:
def looped_ver(k, a):
x = np.empty_like(a)
for i in range(x.size):
sm = 0
for j in range(0, i+1):
sm += k[i-j,j] * a[i-j] * a[j]
x[i] = sm
return x
আমি এটিকে নালীর টুকরো দিয়ে একটি একক লুপ তৈরি করেছি:
def vectorized_ver(k, a):
ktr = zeros_like(k)
ar = zeros_like(k)
sz = len(a)
for i in range(sz):
ktr[i,:i+1] = k[::-1].diagonal(-sz+i+1)
a_ = a[:i+1]
ar[i,:i+1] = a_[::-1] * a_
return np.sum(ktr * ar, 1)
n = 5000
তারপরে আমি (আরও পাঠযোগ্য) লুপ করা কোডটির একটি সিথন সংস্করণ লিখেছিলাম।
import numpy as np
import cython
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
def cyth_ver(double [:, ::1] k not None,
double [:] a not None):
cdef double[:] x = np.empty_like(a)
cdef double sm
cdef int i, j
for i in range(len(a)):
sm = 0.0
for j in range(i+1):
sm = sm + k[i-j,j] * a[i-j] * a[j]
x[i] = sm
return x
আমার ল্যাপটপে, এটি লুপযুক্ত সংস্করণের চেয়ে প্রায় 200x দ্রুত (এবং 1-লুপ ভেক্টরাইজড সংস্করণের চেয়ে 8x দ্রুত)। আমি নিশ্চিত অন্যরা আরও ভাল করতে পারে।
আমি জুলিয়া সংস্করণ দিয়ে খেলেছি, এবং মনে হয়েছিল (আমি যদি এটি সঠিকভাবে টাইম করি) সিথন কোডের সাথে তুলনীয়।