【问题标题】:How to (effienciently) construct a string in Cython?如何(有效地)在 Cython 中构造一个字符串?
【发布时间】:2017-04-22 14:47:11
【问题描述】:

我正在尝试用 cython 固定我的 python 代码。

在 cython 中,我试图消除的瓶颈之一是在循环中构造文件名(字符串)。 但是,我无法以 cython 方式重新编写我的 python 代码:

 cdef str filename, path

 for ii in range(len(a0)):
   for jj in range(len(a1)):
       filename = self.path + 'directory' + format(int(lon[ii,jj]),'02d')+ '_' + format(int(lat[ii,jj]),'02d') + '.csv'

任何关于如何重写它的帮助将不胜感激! 谢谢

【问题讨论】:

  • 请不要使用“a0”、“a1”、“ii”和“jj”之类的变量——它们很难推理。此外,您不需要执行 range(len(a0)),如果您的变量是可迭代的,只需执行 for ii in a0 或等效项。
  • format 是一个Python 函数,字符串+ 也是如此。 lon[ii,jj] 索引 (numpy) 也是如此。 cython 可以转换为“纯”C 的东西并不多。
  • 快速浏览一下cython 字符串文档cython.readthedocs.io/en/latest/src/tutorial/strings.html,表明它对加速字符串操作没有多大作用。他们不鼓励使用c 字符串。与C++ 字符串库的接口可能会起作用。
  • 您打算使用文件名读取还是写入csv?我的猜测是创建文件名字符串比打开和使用该文件花费的时间要少得多。优化此任务可能不值得。
  • format 的使用表明您使用的是 Py3 和 unicode 字符串。阅读 cythonc 中关于不支持 unicode 的说法。

标签: python string char cython


【解决方案1】:

我怀疑您可以加快 Python 中的格式化速度。例如:

In [67]: lat=np.arange(6).reshape(2,3)
In [68]: names=[]
In [69]: for i in range(lat.shape[0]):
    ...:     for j in range(lat.shape[1]):
    ...:        name = 'path/'+'directory'+format(lat[i,j],'02d')+'_'+format(lat
    ...: [i,j]+3,'02d')+'.csv'
    ...:        names.append(name)
    ...:        
In [70]: names
Out[70]: 
['path/directory00_03.csv',
 'path/directory01_04.csv',
 'path/directory02_05.csv',
 'path/directory03_06.csv',
 'path/directory04_07.csv',
 'path/directory05_08.csv']

可以修改为:

In [71]: names=[]
In [72]: fmt='path/'+'directory/'+'%02d_%02d.csv'
In [73]: for i in range(lat.shape[0]):
    ...:     for j in range(lat.shape[1]):
    ...:        name = fmt%(lat[i,j],lat[i,j])
    ...:        names.append(name)

换句话说,在开始时创建一个格式字符串,然后重复使用它。

或者对于 PY3 样式format

fmt = 'path/directory{:02d}_{:02d}.csv'
name = fmt.format(lat[i,j],lat[i,j])

快速时间测试表明速度提高了 2-3 倍(较旧的% 风格更快)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2014-04-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多