2 回答
TA贡献1982条经验 获得超2个赞
做一些时间测试
path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=False)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=True)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=path[0])
在我的测试中,第二个 2 以相同的速度运行。对于小问题optimize=False更快,大概是因为分析和重新排列需要时间。对于大问题,理论加速比更大,实际加速比True可能大于理论。据推测,内存管理正在减缓这种False情况。
该theoretical speedup就是这样,仅仅基于一个估计FLOPS计数。只有当 FLOPS 在计算中占主导地位时,这才是正确的。
你也可以计时path计算。问题的大小将决定它的时间是总时间的一小部分还是大部分。
TA贡献1874条经验 获得超12个赞
从源代码
Theoretical Speedup = speedup = naive_cost / opt_cost
naive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)
因此,从这一点来看,要加快该过程,您需要降低FLOPS(每秒浮点运算)。由于朴素成本是未优化表达式的成本,因此您需要以这样一种方式重写您的表达式,即删除与表达式相关的任何“垃圾”,同时在不更改表达式的基础结构的情况下离开。
从你的问题来看,你正在做一些复杂的表达,这可能是不可能的。但是要回答你的问题,尝试重写你的表达式是一种更紧凑的方式,以获得较低的理论加速。
您可以尝试使用不同的路径来降低您的 FLOPS。
添加回答
举报