- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
编辑:正如@sehe 所指出的,错误位于介数中心性计算之前的某处。继续前进!
我在 Python
和 C++
中实现了一个最小程序来计算无向图的介数中心性。令人惊讶的是,networkx
(Python) 版本 far 优于 boost::graph
(C++) 实现,即使考虑到加载开销等.我在做一些完全没有效率的事情吗?
Python 代码的要点很简单
# load graph and start chrono
clist = nx.betweenness_centrality(g)
# output
对于 C++,我们有
typedef boost::adjacency_list<boost::vecS,
boost::vecS,
boost::undirectedS> Graph;
typedef boost::property_map< Graph, boost::vertex_index_t>::type VertexIndexMap;
int main() {
Graph g;
// ...
// load graph
// ...
VertexIndexMap v_index = get(boost::vertex_index, g);
std::vector< double > vertex_property_vec(boost::num_vertices(g), 0.0);
boost::iterator_property_map< std::vector< double >::iterator, VertexIndexMap >
vertex_property_map(vertex_property_vec.begin(), v_index);
boost::brandes_betweenness_centrality(g, vertex_property_map);
// Output ...
return 0;
}
请注意,这两个库似乎实现了完全相同的算法 (Brandes 2001)。
最佳答案
我无法重现该问题。您未显示的代码中可能有某些内容?
希望我的基准测试能有所帮助,它在我的 PC 上总共运行了 20 秒的 2000 个节点和 4000 条边的 90 个随机图。
注意事项:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/betweenness_centrality.hpp>
#include <boost/graph/random.hpp>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <random>
typedef boost::adjacency_list<boost::vecS,
boost::vecS,
boost::undirectedS> Graph;
typedef boost::property_map<Graph, boost::vertex_index_t>::type VertexIndexMap;
int main() {
for (int i = 0; i < 90; ++i) {
auto const seed = std::random_device{}();
Graph g;
{
std::mt19937 prng { seed };
boost::generate_random_graph(g, 200, 400, prng);
}
std::vector<double> centrality(boost::num_vertices(g), 0.0);
{
VertexIndexMap v_index = get(boost::vertex_index, g);
boost::iterator_property_map<std::vector<double>::iterator, VertexIndexMap>
vertex_property_map = make_iterator_property_map(centrality.begin(), v_index);
boost::brandes_betweenness_centrality(g, vertex_property_map);
}
{
namespace ba = boost::accumulators;
namespace bt = ba::tag;
ba::accumulator_set<double, ba::features<bt::mean, bt::variance> > acc;
std::for_each(centrality.begin(), centrality.end(), std::ref(acc));
std::cout << "seed:" << seed << "\t" << "mean:" << ba::mean(acc) << "\t" << "stddev:" << ba::variance(acc) << "\n";
}
}
}
我机器的输出(2000 个节点/4000 个边):
seed:1750802922 mean:4376.07 stddev:1.81521e+07
seed:2035487211 mean:4453.37 stddev:1.86408e+07
seed:2157083839 mean:4431.28 stddev:1.76926e+07
seed:877099895 mean:4397.33 stddev:1.77377e+07
seed:3204597236 mean:4437.76 stddev:1.76055e+07
seed:1683789044 mean:4366.15 stddev:1.79065e+07
seed:205823178 mean:4382.23 stddev:1.97325e+07
seed:835182347 mean:4437.69 stddev:1.99322e+07
seed:783544360 mean:4419.82 stddev:1.99628e+07
seed:1294214099 mean:4450.26 stddev:1.86657e+07
seed:133119335 mean:4474.56 stddev:1.80184e+07
seed:2431619152 mean:4398.11 stddev:1.8606e+07
seed:1846518108 mean:4487.64 stddev:1.82487e+07
seed:3215400061 mean:4487.08 stddev:1.89737e+07
seed:4195971142 mean:4366.36 stddev:1.83186e+07
seed:2877690475 mean:4387.66 stddev:1.67049e+07
seed:377384221 mean:4447.82 stddev:1.88145e+07
seed:4271065968 mean:4397.8 stddev:1.90055e+07
seed:2344426096 mean:4439.01 stddev:1.67352e+07
seed:3089481099 mean:4392.55 stddev:1.85857e+07
seed:2366154376 mean:4424.22 stddev:1.8114e+07
seed:609566395 mean:4412.17 stddev:1.83808e+07
seed:532359230 mean:4385.37 stddev:1.90363e+07
seed:1222481049 mean:4389.03 stddev:1.8123e+07
seed:4252784567 mean:4424.44 stddev:1.97951e+07
seed:3589086722 mean:4441.63 stddev:1.89086e+07
seed:3253153938 mean:4434.16 stddev:1.83747e+07
seed:3171332867 mean:4425.64 stddev:1.88349e+07
seed:1628933501 mean:4389.3 stddev:1.77686e+07
seed:2757066761 mean:4456.54 stddev:1.86788e+07
seed:253689423 mean:4457.74 stddev:1.88101e+07
seed:1044077369 mean:4437.64 stddev:1.94368e+07
seed:2010288733 mean:4335.93 stddev:1.96337e+07
seed:2827445098 mean:4404.35 stddev:1.72173e+07
seed:2983615584 mean:4451.17 stddev:1.87881e+07
seed:3263411780 mean:4352.61 stddev:1.84145e+07
seed:209486011 mean:4388.81 stddev:2.00036e+07
seed:914410356 mean:4394.58 stddev:1.8876e+07
seed:4179887676 mean:4458.33 stddev:1.79864e+07
seed:1672110941 mean:4527.26 stddev:1.88183e+07
seed:1180712876 mean:4410.68 stddev:1.77379e+07
seed:3297971268 mean:4314.57 stddev:1.76706e+07
seed:1888708924 mean:4432.68 stddev:1.81473e+07
seed:519304960 mean:4346.21 stddev:1.96675e+07
seed:989700613 mean:4404.25 stddev:1.89632e+07
seed:3290422387 mean:4424.13 stddev:1.82944e+07
seed:1248119514 mean:4449.89 stddev:1.94721e+07
seed:2609686267 mean:4495.49 stddev:1.97461e+07
seed:2169392337 mean:4506.17 stddev:1.67787e+07
seed:222259970 mean:4525.36 stddev:1.94983e+07
seed:2302951742 mean:4449.87 stddev:1.86658e+07
seed:803085249 mean:4434.22 stddev:1.90194e+07
seed:291896941 mean:4388.42 stddev:1.92467e+07
seed:3271497352 mean:4401.03 stddev:1.98458e+07
seed:119293674 mean:4441.89 stddev:1.87025e+07
seed:2067901961 mean:4444.3 stddev:1.91092e+07
seed:884669150 mean:4370 stddev:1.77506e+07
seed:2010782469 mean:4427.87 stddev:1.9524e+07
seed:2999945815 mean:4341.03 stddev:1.93057e+07
seed:1413596477 mean:4429.33 stddev:1.88379e+07
seed:2999144075 mean:4346.83 stddev:1.83441e+07
seed:52996326 mean:4479.39 stddev:1.90295e+07
seed:846523521 mean:4476.82 stddev:1.80105e+07
seed:2665690159 mean:4399.54 stddev:1.92723e+07
seed:1290757175 mean:4373.11 stddev:1.80565e+07
seed:4174263463 mean:4382.66 stddev:1.89344e+07
seed:2416968118 mean:4474.83 stddev:1.91461e+07
seed:1137975099 mean:4406.52 stddev:1.89247e+07
seed:1776900404 mean:4443.7 stddev:1.91418e+07
seed:898128099 mean:4466.54 stddev:1.87237e+07
seed:3604582552 mean:4379.01 stddev:1.73953e+07
seed:3268788789 mean:4418.29 stddev:1.83793e+07
seed:910639960 mean:4507 stddev:1.73813e+07
seed:1878704662 mean:4400.72 stddev:1.81355e+07
seed:2667792405 mean:4462.01 stddev:1.81283e+07
seed:2492001126 mean:4403.49 stddev:1.86103e+07
seed:3485479239 mean:4389.32 stddev:1.84779e+07
seed:3202616710 mean:4539.88 stddev:1.94982e+07
seed:2878361287 mean:4454.12 stddev:1.86021e+07
seed:1196553996 mean:4419.3 stddev:1.86354e+07
seed:3641446403 mean:4451.88 stddev:1.857e+07
seed:2801960787 mean:4469.33 stddev:1.89828e+07
seed:1938419870 mean:4462.89 stddev:1.82868e+07
seed:176826289 mean:4464.34 stddev:1.76994e+07
seed:2873298171 mean:4415.06 stddev:1.87784e+07
seed:2992765364 mean:4395.07 stddev:1.88507e+07
seed:2883991750 mean:4422.02 stddev:1.87585e+07
seed:2985503953 mean:4479.98 stddev:1.91894e+07
seed:3822049160 mean:4439.22 stddev:1.80799e+07
seed:2881148075 mean:4341.83 stddev:1.82921e+07
关于c++ - Boost::graph (c++) 优于 networkx (python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35029305/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!