我正在创建随机Toeplitz矩阵来估计它们可逆的概率.我目前的代码是
import random
from scipy.linalg import toeplitz
import numpy as np
for n in xrange(1,25):
rankzero = 0
for repeats in xrange(50000):
column = [random.choice([0,1]) for x in xrange(n)]
row = [column[0]]+[random.choice([0,1]) for x in xrange(n-1)]
matrix = toeplitz(column, row)
if (np.linalg.matrix_rank(matrix) < n):
rankzero += 1
print n, (rankzero*1.0)/50000
Run Code Online (Sandbox Code Playgroud)
这可以加快吗?
我想增加值50000以获得更高的准确度,但目前这样做太慢了.
仅使用for n in xrange(10,14)节目进行性能分析
400000 9.482 0.000 9.482 0.000 {numpy.linalg.lapack_lite.dgesdd}
4400000 7.591 0.000 11.089 0.000 random.py:272(choice)
200000 6.836 0.000 10.903 0.000 index_tricks.py:144(__getitem__)
1 5.473 5.473 62.668 …Run Code Online (Sandbox Code Playgroud) 我使用刚刚给出的链接安装了distribute和pip.我还安装了Microsoft Visual C++ 2008可再发行组件包.但是,当我尝试使用pip.exe时,我得到了
error: Unable to find vcvarsall.bat
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我有一组轴平行的二维矩形,由它们的左上角和右下角定义(都在整数坐标中)。给定一个点查询,你如何有效地确定它是否在一个矩形中?我只需要一个是/否的答案,不需要担心它在哪个矩形中。
我可以通过查看 x 是否在 x1 和 x2 之间以及 y 是否在 y1 和 y2 之间来检查 (x,y) 是否在 ((x1, y1), (x2, y2)) 中。我可以为每个矩形单独执行此操作,这些矩形以矩形数量的线性时间运行。但是由于我有很多矩形并且我会做很多点查询,所以我想要更快的东西。
给定一组n对整数,有一种快速的方法来确定是否存在两对(x 1,y 1)和(x 2,y 2),以便集合{x 1,y 1 } 的交集并且{x 2,x 2 }是空的?
例如,{(0,1),(0,2),(2,1),(3,2)}具有{(0,1),(3,2)}作为答案.然而{(0,1),(0,2),(2,1)}没有这样的对.
在Python中,您可以按如下方式尝试所有对.
l = [(0,1), (0,2), (2,1), (3,2)]
print [pairs for pairs in itertools.combinations(l, 2)
if not (set(pairs[0]) & set(pairs[1]))]
Run Code Online (Sandbox Code Playgroud)
这种方法需要O(n 2)次.你能得到更接近线性时间的东西吗?
是否可以编写C代码,以便在编译时使用
gcc -o foo foo.c
Run Code Online (Sandbox Code Playgroud)
它实际上用-O2编译foo.c?
我正在使用gcc 4.4.6.