我的“arr_coordinates”將 x 和 y 坐標存盤在 2 個不同的列中。'distance' 函式回傳一個陣列,其中包含坐標之間的所有距離。
我的代碼:
xlim = (0, 1800)
ylim = (0, 1800)
arr_x = ([])
arr_y = ([])
for i in range(300):
arr_x = np.append(arr_x, random.randint(xlim[0], xlim[1]))
arr_y = np.append(arr_y, random.randint(ylim[0], ylim[1]))
arr_coordinates = np.vstack((arr_x, arr_y)).T
@numba.jit(forceobj=True)
def distance(arr_coordinates):
arr_distances = ([])
for i in range(len(arr_coordinates)):
coordinate = arr_coordinates[i]
for j in range(len(arr_coordinates)):
other_coordinate = arr_coordinates[j]
distance = ((other_coordinate[0] - coordinate[0]) ** 2 (other_coordinate[1] - coordinate[1]) ** 2) ** 0.5 #√[(x? - x?)2 (y? - y?)2]
arr_distances = np.append(arr_distances, distance)
return arr_distances
print("time", timeit.timeit(functools.partial(distance, arr_coordinates), number=1))
如果沒有 Numba 裝飾器,它會更快。
uj5u.com熱心網友回復:
首先,你應該忘記np.append存在一個名字的函式,這個函式很慢,比它慢一千倍list.append,如果可以預先計算輸出大小并在開始時保留它,那么你一定要這樣做,目前是您的情況。
import numpy as np
import random
import numba
import timeit
import functools
from math import sqrt
xlim = (0, 1800)
ylim = (0, 1800)
arr_x = ([])
arr_y = ([])
for i in range(300):
arr_x = np.append(arr_x, random.randint(xlim[0], xlim[1]))
arr_y = np.append(arr_y, random.randint(ylim[0], ylim[1]))
arr_coordinates = np.vstack((arr_x, arr_y)).T
@numba.jit(forceobj=True)
def distance(arr_coordinates):
arr_distances = ([])
for i in range(len(arr_coordinates)):
coordinate = arr_coordinates[i]
for j in range(len(arr_coordinates)):
other_coordinate = arr_coordinates[j]
distance = ((other_coordinate[0] - coordinate[0]) ** 2 (other_coordinate[1] - coordinate[1]) ** 2) ** 0.5 #√[(x? - x?)2 (y? - y?)2]
arr_distances = np.append(arr_distances, distance)
return arr_distances
@numba.njit
def distance_numba(arr_coordinates):
arr_distances = np.empty((len(arr_coordinates),len(arr_coordinates)),dtype=arr_coordinates.dtype)
for i in range(len(arr_coordinates)):
coordinate = arr_coordinates[i]
for j in range(len(arr_coordinates)):
other_coordinate = arr_coordinates[j]
distance = sqrt(((other_coordinate[0] - coordinate[0]) ** 2 (other_coordinate[1] - coordinate[1]) ** 2)) #√[(x? - x?)2 (y? - y?)2]
arr_distances[i,j] = distance
return arr_distances
functools.partial(distance, arr_coordinates)() # never time the first call
functools.partial(distance_numba, arr_coordinates)() # never time the first call
print("time", timeit.timeit(functools.partial(distance, arr_coordinates),number = 1))
print("time", timeit.timeit(functools.partial(distance_numba, arr_coordinates), number= 1))
time 2.0872249000000003
time 0.0002234000000003178
并且有一個 10,000 的加速只是因為我們不再使用np.append,并且實際上預先保留了記憶體。
一個小提示,使用sqrt也比**0.5因為計算機具有sqrt比硬體更快的特殊硬體pow。
至于**2編譯器會正確地將其決議為x*x而不是呼叫pow,因此不需要手動展開。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516059.html
標籤:Python麻木的麻木
