matlab - 对于parfor,表格的垂直连接太慢了
问题描述
我在垂直连接表格时遇到速度问题,每个表格都是 parfor 循环的一部分。
这就是我所做的:
T = table(group1, group2, val1, val2, ...);
T = sortrows(T, {'group1', 'group2'}); % possible speed gains from sorting?
[Pairs, idx] = unique([T.group1, T.group2], 'rows');
idx1 = [idx; height(T)+1]; % to include the last index
idx2 = idx1(2:end) - 1;
idx1 = idx1(1:end-1);
T_ = [];
parfor i=1:length(Pairs)
tmpIdx = idx1(i):idx2(i);
T_ = T(tmpIdx, :);
T__ = myFun(T_);
T_ = [T_; T__];
end
function T_out = myFun(T_in)
vlist = T_in.Properties.VariableNames;
T_out = T_in(:, vlist) % preallocation
% overwrite values
for i = 1 : length(vlist)
T_out.vlist(2:end, i) = T_in{1:end-1, vlist{i}};
end
end
在里面myFun()
,我做了一些计算T.val1, T.val2...
。但是,上面太慢了。我检查了分析器,发现大部分时间都花在了
1) T_=T(tmpIdx, :)
( tabular.vertcat
)
2)T_out.vlist(2:end, i) = T_.vlist{1:end-1, vlist{i}}
内myFun
( tabular.subsasgn, tabular.subsref
)
对于 1),尽管速度很慢,但我想切片T
是不可避免的,因为我正在计算具有唯一对的值T.group1
和T.group2
。
虽然主要问题是 1),但花在 2) 上的时间也很重要。
有什么好的改进想法吗?任何评论/建议都会非常有帮助。
解决方案
推荐阅读
- reactjs - 为什么我的 uid 未定义
- angularjs - OpenCV.JS cv.Sift 不是构造函数
- r - 如何使用 iotools 逐块读取数据帧?
- c++ - 提高克隆模式的安全性
- python-3.x - 如何选择矩阵的某些元素以使用 np.array 创建一个新元素?
- git - 如何从分支中拉出忽略来自主人的所有冲突
- c - C中的数组到链表函数;如何遍历列表以附加节点?
- elasticsearch - 弹性搜索多重匹配:有没有办法搜索除一个以外的所有字段?
- python - Best model for variable selection with big data?
- python - How to install psycopg2 Python on mac?