我正在寻找一种有效的数据结构来表示Python/Cython中非常大的整数矩阵,重点关注元素操作.
我目前正在构建一个模型,该模型需要在大型高度稀疏矩阵上进行大量元素操作(在2MMx500k矩阵上读取/写入大约500亿次).以前我在较小的数据上运行实验,并使用Python与Cython和Numpy数组,并且理想情况下将继续使用现有基础结构的某些部分.
到目前为止我已查看/实施了许多选项.它们可能没有完全优化,但所有实现都应该足够好,以便对每种方法的潜力给出切合实际的想法.我已经通过创建一个2MMx500k矩阵进行测试,添加了25MM元素,然后再次删除它们.这反映了我需要的那种操作.
29 minutes: Cython lists to fill scipy.sparse.coo -> sparse.dok
10 minutes: Cython lists to fill scipy.sparse.coo -> sparse.lil
3 minutes: Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j]
3 minutes: Dict, s.t. A[(i,j)] contains M[i][j]
<1 minute: Dict, s.t. A[i*N,j] contains M[i][j]
<1 minute: <std::map> using Cython
Run Code Online (Sandbox Code Playgroud)
到目前为止,黑客攻击一个词典表现最好,但仍然相当慢.这也感觉太糟糕了,所以我假设必须有一个更有效的方法,特别是考虑到dict解决方案并没有真正使用任何潜在的Cython可以提供.是否有更多的Cythonic解决方案?不幸的是,谷歌并没有太大的帮助(或者我没有正确的搜索关键词).
任何有关如何做到这一点的建议将不胜感激!
编辑1
两个字典解决方案之间的区别在于A ["%d_%d"%(i,j)]变体访问速度更快,而A [(i,j)]变体的设置速度更快.
Setup Execution
Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j] 180s 30s
Dict, s.t. A[(i,j)] contains M[i][j] 66s 104s
Dict, s.t. Dict, s.t. A[i*N,j] contains M[i][j] …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写正则表达式来匹配可能包含或不包含两个标记的字符串.我需要表达式返回字符串的所有五个元素,具体取决于它们是否存在,但是当我使标记可选时,通配符似乎吞噬它们:
输入可以是:
text{a}more{b}words
{a}text{b}test
text
text{b}text
text{b}
text{a}text
Run Code Online (Sandbox Code Playgroud)
等等.唯一保证的是,如果它们存在,<a>它将始终<b>存在.
我的表达现在看起来如下:
^(.*?)(\{a\})?(.*?)(\{b\})?(.*?)$
Run Code Online (Sandbox Code Playgroud)
不幸的是,无论标签是否存在,最终都会将所有文本丢入最后一组.有没有办法让他们贪心,但保持他们可选?re.findall不幸的是,似乎没有帮助.
任何帮助将不胜感激!:)