我有一个列表理解,看起来像这样:
cart = [ ((p,pp),(q,qq)) for ((p,pp),(q,qq))\
in itertools.product(C.items(), repeat=2)\
if p[1:] == q[:-1] ]
Run Code Online (Sandbox Code Playgroud)
C是一个带有键的字典,它是任意整数的元组.所有元组都有相同的长度.最糟糕的情况是所有组合都应包含在新列表中.这可能经常发生.
举个例子,我有一个这样的字典:
C = { (0,1):'b',
(2,0):'c',
(0,0):'d' }
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
cart = [ (((2, 0), 'c'), ((0, 1), 'b'))
(((2, 0), 'c'), ((0, 0), 'd'))
(((0, 0), 'd'), ((0, 1), 'b'))
(((0, 0), 'd'), ((0, 0), 'd')) ]
Run Code Online (Sandbox Code Playgroud)
因此,通过重叠,我指的是,例如,元组(1,2,3,4)并(2,3,4,5)具有重叠部分(2,3,4).重叠部分必须位于元组的"边缘"上.我只想要长度比元组长度短的重叠.因此(1,2,3,4)不重叠(3,4,5,6).还要注意,当删除元组的第一个或最后一个元素时,我们可能会得到非独特的元组,所有元组都必须与所有其他元素进行比较.在我的第一个例子中没有强调最后一点.
我的代码执行时间的更好部分花在了这个列表理解上.我总是需要所有元素,cart因此在使用发电机时似乎没有加速.
我的问题是:有更快的方法吗?
我的想法是我可以尝试创建两个这样的新词典:
aa = defaultdict(list)
bb = defaultdict(list)
[aa[p[1:]].append(p) for p in C.keys()] …Run Code Online (Sandbox Code Playgroud) 我正在使用python 2.7和pyodbc 3.0.6访问与我的计算机在同一网络上运行的db2(9.7)服务器。
以下是与我尝试执行的操作类似的非常精简的示例。
import pyodbc as db
def dbcur(connectname):
con = db.connect(connectname)
cur = con.cursor()
return cur,con
def main():
print 'a'
cur,con = dbcur('DSN=MYODBCCON')
print 'b'
# X.name is a short varchar
qry = """
select
X.name as N
from schema.table as X
"""
print 'c'
cur.execute(qry)
print 'd'
c = 0
for row in cur:
c+=1
if not c%100:
print c, row
return
if __name__ == '__main__': main()
Run Code Online (Sandbox Code Playgroud)
此代码在Windows 8计算机上运行非常慢(10秒钟内运行100行)。但是,在装有Windows 7的同事计算机上,这闪电般快。他的计算机类似地被指定为我的计算机,并且他具有相同版本的pyodbc和python,所以我不认为这是一个问题。
当我同时使用IBM DB2 ODBC DRIVER和IBM DATA SERVER DRIVER …
我正在使用一种算法,对于每次迭代,需要找到一组生态协调所属的Voronoi图的哪个区域.也就是说,每个坐标位于哪个区域内.(我们可以假设所有坐标都属于一个区域,如果这有任何区别的话.)
我还没有任何适用于Python的代码,但伪代码看起来像这样:
## we are in two dimensions and we have 0<x<1, 0<y<1.
for i in xrange(1000):
XY = get_random_points_in_domain()
XY_candidates = get_random_points_in_domain()
vor = Voronoi(XY) # for instance scipy.spatial.Voronoi
regions = get_regions_of_candidates(vor,XY_candidates) # this is the function i need
## use regions for something
Run Code Online (Sandbox Code Playgroud)
我知道scipy.Delaunay有一个名为find_simplex的函数,它会在Delaunay三角剖分中完成我想要的简单操作,但是我需要Voronoi图,并且我希望避免构建它们.
问题:
1.是否有某种类型的库可以让我轻松完成这项工作?
2.如果没有,是否有一个好的算法可以让我有效地做到这一点?
更新
Jamie的解决方案正是我想要的.我有点尴尬,虽然我自己也没想过......
python ×3
algorithm ×1
db2 ×1
dictionary ×1
odbc ×1
performance ×1
pyodbc ×1
scipy ×1
tesselation ×1
voronoi ×1
windows ×1