小编doe*_*toe的帖子

在不同优化级别以gcc/g ++访问本地变量和全局变量的速度

我发现gcc中的不同编译器优化级别在循环中访问本地或全局变量时会产生完全不同的结果.这让我感到惊讶的原因是,如果访问一种类型的变量比访问另一种变量更可优化,我认为gcc优化会利用这一事实.这里有两个例子(在C++中,但它们的C对应物实际上给出了相同的时间):

    global = 0;
    for (int i = 0; i < SIZE; i++)
        global++;
Run Code Online (Sandbox Code Playgroud)

它使用一个全局变量long global,对

    long tmp = 0;
    for (int i = 0; i < SIZE; i++)
        tmp++;
    global = tmp;
Run Code Online (Sandbox Code Playgroud)

在优化级别-O0,时间基本相等(如我所料),在-O1它稍快但仍然相等,但是从-O2使用全局变量的版本要快得多(大约7倍).

另一方面,在下面的代码片段中,起始点指向大小为SIZE的字节块:

    global = 0;
    for (const char* p = start; p < start + SIZE; p++)
        global += *p;
Run Code Online (Sandbox Code Playgroud)

    long tmp = 0;
    for (const char* p = start; p < start + SIZE; p++)
        tmp += *p;
    global = tmp;
Run Code Online (Sandbox Code Playgroud)

这里的-O0时间很接近,虽然使用局部变量的版本稍微快一点,这似乎并不太令人惊讶,因为它可能会存储在寄存器中,而global …

c c++ optimization gcc g++

15
推荐指数
2
解决办法
6409
查看次数

同情多元系列扩展

有没有人知道是否有内置函数同意获得表单的多元系列扩展

f(x,y) = a + b*x + c*y + d*x**2 + e*x*y + f*y**2 + ...
Run Code Online (Sandbox Code Playgroud)

即按所有变量的升序排列?

提前致谢.

python sympy

5
推荐指数
2
解决办法
1078
查看次数

如何计算C++中两个STL集的交集大小

我有两组(std :: set from <set>),我想知道它的大小.我可以使用std :: set_intersection <algorithm>,但我必须提供一个输出迭代器来将交集复制到其他容器中.

一种直截了当的方式

  set<int> s1{1,2,3,4,5};
  set<int> s2{4,5,6,7,8,9,0,1};

  vector<int> v;

  set_intersection(
      s1.begin(), s1.end(), s2.begin(), s2.end(),
      inserter(v, v.begin()));
Run Code Online (Sandbox Code Playgroud)

之后v.size()给出了交集的大小.但是,即使我们不对它进行任何操作,也必须存储交集.

为了避免这种情况,我试图实现一个虚拟输出迭代器类,它只计算,但它不分配:

template<typename T>
class CountingOutputIterator {
 private:
  int* counter_;
  T dummy_;
 public:
  explicit CountingOutputIterator(int* counter) :counter_(counter) {}
  T& operator*() {return dummy_;}
  CountingOutputIterator& operator++() { // ++t
    (*counter_)++;
    return *this;
  }
  CountingOutputIterator operator++(int) { // t++
    CountingOutputIterator ret(*this);
    (*counter_)++;
    return ret;
  }
  bool operator==(const CountingOutputIterator& c) {
    return counter_ == c.counter_; // same pointer …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm stl

5
推荐指数
1
解决办法
1838
查看次数

在 Python 中 fork 时父子进程之间的通信

我试图让一个 Python 程序同时运行一个处理循环和一个结果广播服务,使用对 os.fork() 的调用,类似于

pid = os.fork()
if pid == 0:
    time.sleep(3)
    keep_updating_some_value_while_parent_is_running()
else:
    broadcast_value()
Run Code Online (Sandbox Code Playgroud)

这里keep_updating_some_value_while_parent_is_running(),由子进程执行,存储一些值,只要父进程在运行,它就会不断更新。它实际上将值写入磁盘,以便父级可以轻松访问它。它通过检查它运行的 Web 服务是否可用来检测父进程是否正在运行。

broadcast_value() 运行一个 web 服务,当被查询时,它从磁盘读取最新的值并提供它。

这种实现效果很好,但由于以下几个原因并不令人满意:

  1. time.sleep(3)是必要的,因为 Web 服务需要一些启动时间。根本无法保证服务会在 3 秒内启动并运行,而另一方面,它可能会更早。

  2. 通过磁盘共享数据并不总是一个好的选择,甚至不可能(所以这个解决方案不能很好地概括)。

  3. 通过检查 Web 服务是否可用来检测父进程是否正在运行并不是很理想,而且对于不同类型的进程(不能那么容易地自动轮询),这根本不起作用。此外,可能是 Web 服务运行良好,但存在临时可用性问题。

  4. 解决方案取决于操作系统。

  5. 当子进程由于某种原因失败或退出时,父进程将继续运行(这可能是所需的行为,但并非总是如此)。

我想要的是让子进程知道父进程何时启动和运行以及何时停止,以及父进程根据请求获取子进程计算的最新值的某种方式,最好是在独立于操作系统的情况下道路。也欢迎涉及非标准库的解决方案。

python fork ipc

5
推荐指数
1
解决办法
1158
查看次数

在C ++中,为什么不能使用两个默认随机引擎生成独立的随机整数样本

我想要在可配置范围内具有独立的整数随机分布。以下程序说明了我最初的工作:

#include <random>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
    default_random_engine generator1;
    default_random_engine generator2;
    uniform_int_distribution<int> dist1(0,atoi(argv[1]));
    uniform_int_distribution<int> dist2(0,atoi(argv[2]));

    generator1.seed(0);
    generator2.seed(1);
    for (int i = 0; i < 60; i++)
        printf("(%d, %d)\n", dist1(generator1), dist2(generator2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,当argv [1]和argv [2]相等时,始终会生成相等的值,并且当它们不同时,依存关系也就不太明显。为了防万一,我使用了不同的引擎实例,甚至为它们植入了不同的种子。

这里发生了什么?我注意到如果我用mt19937替换default_random_engine,问题就消失了,但这是我从未想过的。另外,另一个引擎应该能够产生独立的样本吗?

编辑我正在使用标准库中的g ++ 7.3.0在Ubuntu 16.04.2上工作。

编辑2正如FrançoisAndrieux在评论中推测的那样,这似乎是我环境中特定的默认随机生成器的特殊之处:种子0和1似乎生成相同的随机数序列。所有其他组合生成看似独立的样本。

c++ random c++-standard-library

5
推荐指数
1
解决办法
181
查看次数

python sys.stdout和C++ iostreams :: cout

我假设sys.stdout将引用与在同一进程中运行的iostreams :: cout相同的物理流,但似乎并非如此.下面的代码使用名为"write"的python包装器调用C++函数,该函数写入cout:

from cStringIO import StringIO 
import sys 
orig_stdout = sys.stdout 
sys.stdout = stringout = StringIO() 
write("cout") # wrapped C++ function that writes to cout 
print "-" * 40 
print "stdout" 
sys.stdout = orig_stdout 
print stringout.getvalue() 
Run Code Online (Sandbox Code Playgroud)

立即将"cout"写入控制台,然后分隔符"---...",最后,作为stringout.getvalue()的返回值,字符串"stdout".我的目的是在stringout中捕获从C++写入cout的字符串.有谁知道发生了什么,如果有的话,我怎么能捕获python字符串中写入cout的内容?

提前致谢.

c++ python stdout stringio

4
推荐指数
1
解决办法
4705
查看次数

如何在包装 C++ 代码的 SWIG 中向目标语言(特别是 Python)添加替代构造函数

我正在使用 SWIG 创建一些我无法更改的 C++ 代码的 Python 接口。其中一个 C++ 类有一个构造函数,该构造函数创建一个尚未使用的部分初始化的对象,必须首先对其调用初始化函数。我想在 Python 中通过提供一个替代构造函数来解决这个问题,该构造函数可以同时完成两件事(获取和初始化)。假设在 C++ 中我有

class X {
 public:
  X() {...}
  void init(T a) {...}
  ...
};
Run Code Online (Sandbox Code Playgroud)

在 C++ 中,我必须将 X 实例化为

X x;
x.init(a);
Run Code Online (Sandbox Code Playgroud)

在Python中我想做

x = X(a)
Run Code Online (Sandbox Code Playgroud)

我的解决方案是一个 hack,取决于目标语言和 SWIG 生成包装器代码的具体方式:在我的 .i 文件中,我有

%inline %{
X* new_X(T a) {
  X* ret = new X();
  ret->init(a);
  return ret;
}

%nodefaultctor X;
class X {
 public:
  ...
  %extend {
    %pythoncode {
      def __init__(self, *args):
          this = _modulename.new_X(*args)
          try:
            self.this.append(this)
          except:
            self.this = …
Run Code Online (Sandbox Code Playgroud)

c++ python swig python-extensions

3
推荐指数
1
解决办法
2042
查看次数