适用于Python程序员的C / C ++

时间:2012-03-22 12:28:13

标签: c++ python c numerical

我必须从Python切换到C / C ++。
你知道一个快速的“参考教程”或类似的东西,以引用如何开始?例如Numpy和Scipy教程之类的东西 我已经阅读了很多“文档”,例如

      
  • C ++ for dummies
  •   
  • K& R C编程语言
  •   
  • 很多博客和在线文档,例如:http://eli.thegreenplace.net/2010/01/11/pointers-to-arrays-in-c/,
  •   
  • http://newdata.box.sk/bx/c/
  •   StackOverflow上的
  • 吨Q& A
  •   
  • ...

但是我仍然不清楚如何开始移植到C / C ++之类的东西:

#!/usr/bin/env python

import time
import numpy as np
import tables as tb

"""Retrieve 3D positions form 1000 files and store them in one single HDF5 file.
"""

t = time.time()

# Empty array
sample = np.array([])
sample.shape = (0,3)

# Loop over the files
for i in range(0, 1000):
  filename = "mill2sort-"+str(i)+"-extracted.h5"
  print "Doing ", filename
  # Open data file
  h5f = tb.openFile(filename, 'r')
  # Stack new data under previous data
  sample = np.vstack((sample, h5f.root.data.read()))
  h5f.close()

# Create the new file
h5 = tb.openFile("mill2sort-extracted-all", 'w')
# Save the array
h5.createArray(h5.root, 'data', sample, title='mill_2_sub_sample_all')
h5.flush()
h5.close()

print "Done in ", time.time()-t, " seconds."

在C或C ++中。在这个例子中,我甚至无法理解如何将3D数组传递给找到它的尺寸的函数,例如

int getArrayDimensions(int* array, int *dimensions){
  *dimensions = sizeof(*array)/sizeof(array[0]);
  return 0;
}

数组为

int array[3][3][3] = ...

感谢您的任何建议!:)

3 个答案:

答案 0 :(得分:7)

好的,对于那个特例:

  • 您可以从标准库here
  • 获取时间服务
  • 您可以将eigen用于线性代数。这是一个了不起的图书馆,我很喜欢它。
  • 检查here以了解如何操作文件

使用C ++时,您可能会错过python的一些功能,但大多数功能实际上都是由boost库提供的。例如,boost.tuple库中的here库可以很容易地从函数返回多个值。如果您不想打扰内存管理,可以使用boost::shared_ptr。或者如果你想继续使用python来使用你的c ++类,你可以使用boost.pythonBoost.parameter可帮助您使用命名参数定义函数。 lambda函数也有Boost.lambda,但是如果你的环境支持它,你也可以使用C ++ 11来支持lambda函数。 Boost是一个金矿,永远不会停止挖掘。假设它是标准库的一部分。我在许多不同的平台上开发C ++,而且本征和提升都没让我失望。

Here是一个很好的C ++最佳实践常见问题解答。 This是一个非常重要的原则,在使用C ++时必须始终牢记在心。我在脑海里思考并延伸了一下。如果您要做一些危险的事情,例如:使用原始new分配内存,或者索引原始C样式数组,传递原始指针,或执行static_cast(更糟糕的是{{1}它们通常应该以某种方式专门用于它们,并且确保它们不会造成麻烦的代码与它们非常接近,这样你就可以一眼就看出一切都在掌控之中。

最后,我最喜欢!!!你想继续在C ++中使用生成器吗? Here是一种黑暗魔法。

答案 1 :(得分:5)

好的,我们现在就开始吧。

void readH5Data(FILE *file, int ***sample);   // this is for you to implement
void writeH5Data(FILE *file, int ***sample);  // this is for you to implement

int main(int argc, const char *argv[])
{
#define width 3
#define height 3
#define depth 3

    time_t t = time(NULL);

    int ***sample = calloc(width, sizeof(*sample));

    for (int i = 0; i < width; i++)
    {
        sample[i] = calloc(height, sizeof(**sample));
        for (int j = 0; j < height; j++)
        {
            sample[i][j] = calloc(depth, sizeof(***sample));
        }
    }

    for (int i = 0; i < 1000; i++)
    {
        char *filename[64];
        sprintf(filename, "mill2sort-%i-extracted.h5", i);

        // open the file
        FILE *filePtr = fopen(filename, "r");

        if (filePtr == NULL || ferror(filePtr))
        {
            fprintf(stderr, "%s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }
        readH5Data(filePtr, sample);

        fclose(filePtr);
    }

    char filename[] = "mill2sort-extracted-all";

    FILE *writeFile = fopen(filename, "w");

    if (writeFile == NULL || ferror(writeFile))
    {
        fprintf(stderr, "%s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    writeH5Data(writeFile, sample);

    fflush(writeFile);
    fclose(writeFile);

    printf("Done in %lli seconds\n", (long long int) (time(NULL) - t));

    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < width; j++)
        {
             free(sample[i][j]);
        }

        free(sample[i]);
    }

    free(sample);
}

只要你记得你的数组是3x3x3,你就应该在'writeH5Data'方法中超越边界时没有问题。

答案 2 :(得分:3)

这个问题已经过时了,但这里有一些对我有用的参考资料:

A Transition Guide: Python to C++(pdf)

A Brief Introduction to C++ for Python programmers(不完整但非常好)