在生成完整的上下三角形并可以控制元素的顺序时,最简单的方法是odd_square()
。 scipy.spatial.distance.squareform
期望值逐行,与您从squareform
获得的顺序相同。
从迭代器中获取数据的最快方法是itertools.combinations
:
np.fromiter
模拟数据源:
import numpy as np
from operator import itemgetter
from scipy.spatial.distance import squareform
import itertools as it
原始代码:
def source(n):
for i,j in it.combinations(range(n),2):
yield i,j,(i-j)/2
我的建议:
def OP():
prxy_matrix = np.ones((nn,nn),dtype=float)
for i,p in source(nn):
prxy_matrix[i][j] = p
prxy_matrix[j][i] = p
return prxy_matrix
这已经快了很多,但是我们浪费了创建和丢弃元组的时间(坐标是多余的,所以我们甚至不读取它们)。
您似乎可以控制生成器,请考虑只生成数据:
def pp():
data = np.fromiter(map(itemgetter(2),source(nn)),float,(nn*(nn-1))//2)
prxy_matrix = squareform(data)
prxy_matrix.ravel()[::nn+1] = 1
return prxy_matrix
一些时间:
def val_only(n):
for i,2):
yield (i-j)/2
def pp2():
data = np.fromiter(val_only(nn),(nn*(nn-1))//2)
prxy_matrix = squareform(data)
prxy_matrix.ravel()[::nn+1] = 1
return prxy_matrix
产量:
from timeit import timeit
nn = 1000
print(timeit(OP,number=10))
print(timeit(pp,number=10))
print(timeit(pp2,number=10))
# next three are to give a rough idea how much of the time is due to the iterator alone
print(timeit(lambda:all(source(nn)),number=10))
print(timeit(lambda:sum(val_only(nn)),number=10))
print(timeit(lambda:sum(it.chain.from_iterable(source(nn))),number=10))
本文链接:https://www.f2er.com/3162798.html