小编kyn*_*nan的帖子

为类型化内存视图分配内存的推荐方法是什么?

有关类型化内存视图Cython文档列出了三种分配给类型化内存视图的方法:

  1. 从原始C指针,
  2. 来自np.ndarray
  3. 来自a cython.view.array.

假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.

因此,3个选项可以解释如下:

from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view

np.import_array()

def memview_malloc(int N):
    cdef int * m = <int *>malloc(N * sizeof(int))
    cdef int[::1] b = <int[:N]>m
    free(<void *>m)

def memview_ndarray(int N):
    cdef int[::1] b = np.empty(N, dtype=np.int32)

def memview_cyarray(int N):
    cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.

一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.

推荐三种方法中的哪一种?或者有更好的选择吗? …

python memory buffer memory-management cython

65
推荐指数
2
解决办法
1万
查看次数

使用distutils/setuptools在安装后执行Python脚本

我正在尝试向Python distutils添加安装后任务,如如何使用简单的安装后脚本扩展distutils中所述?.该任务应该在已安装的lib目录中执行Python脚本.此脚本生成安装包所需的其他Python模块.

我的第一次尝试如下:

from distutils.core import setup
from distutils.command.install import install

class post_install(install):
    def run(self):
        install.run(self)
        from subprocess import call
        call(['python', 'scriptname.py'],
             cwd=self.install_lib + 'packagename')

setup(
 ...
 cmdclass={'install': post_install},
)
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但据我所知,有两个不足之处:

  1. 如果用户使用的Python解释器不是拾取者PATH,则安装后脚本将使用不同的解释器执行,这可能会导致问题.
  2. 它对于干运行等是不安全的,我可以通过将其包装在一个函数中并使用它来解决它distutils.cmd.Command.execute.

我怎样才能改进我的解决方案?这样做有推荐的方法/最佳做法吗?如果可能的话,我想避免引入另一个依赖.

python install distutils setuptools post-install

29
推荐指数
1
解决办法
1万
查看次数

关于chrome.tabs.executeScript(id,details,callback)

这个函数有一个回调,如:function(任何结果的数组){...};

但我不知道结果意味着什么.

例如,chrome.tabs..executeScript(null,{code:"var x = 10"},function(){});

如何将"x"返回给回调?

google-chrome-extension

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

Python distutils,如何获得将要使用的编译器?

例如,我可以使用python setup.py build --compiler=msvc或者python setup.py build --compiler=mingw32仅使用python setup.py build,在这种情况下将使用默认编译器(例如bcpp).如何在setup.py中获取编译器名称(例如msvc,mingw32bcpp,分别)?

UPD.:我不需要默认的编译器,我需要实际使用的那个,这不一定是默认的.到目前为止,我还没有找到比解析更好的方法sys.argv来查看那里是否有--compiler...字符串.

python compiler-construction installation distutils

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

bash:如何根据模式从数组中删除元素

假设我有一个bash数组(例如所有参数的数组),并希望删除与特定模式匹配的所有参数,或者将所有剩余元素复制到新数组.或者,反过来,保持元素匹配模式.

举例说明:

x=(preffoo bar foo prefbaz baz prefbar)
Run Code Online (Sandbox Code Playgroud)

我想删除所有内容pref以便获取

y=(bar foo baz)
Run Code Online (Sandbox Code Playgroud)

(订单不相关)

如果我想要用空格分隔的单词列表,那该怎么办?

x="preffoo bar foo prefbaz baz prefbar"
Run Code Online (Sandbox Code Playgroud)

然后再次删除所有内容pref以便获取

y="bar foo baz"
Run Code Online (Sandbox Code Playgroud)

arrays bash list

19
推荐指数
4
解决办法
2万
查看次数

Py Pandas .format(dataframe)

作为Python新手我最近发现使用Py 2.7我可以做类似的事情:

print '{:20,.2f}'.format(123456789)
Run Code Online (Sandbox Code Playgroud)

这将产生最终的输出:

123,456,789.00
Run Code Online (Sandbox Code Playgroud)

我现在想要为pandas df获得类似的结果,所以我的代码就像:

import pandas as pd
import random
data = [[random.random()*10000 for i in range(1,4)] for j in range (1,8)]
df = pd.DataFrame (data)
print '{:20,.2f}'.format(df)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我有错误:

 Unknown format code 'f' for object of type 'str'
Run Code Online (Sandbox Code Playgroud)

有什么建议'{:20,.2f}'.format(df)吗?

现在我的想法是索引数据框(它是一个小的),然后格式化其中的每个浮动,可能分配astype(str),并重建DF ......但看起来很丑陋:-(和我'我甚至不确定它会起作用..

你怎么看 ?我被卡住了...并希望在将这些数据帧转换为reportlabs网格时为我的数据帧提供更好的格式.

python format dataframe pandas

17
推荐指数
1
解决办法
2万
查看次数

Coffeescript中的空对象

我想创建一个if语句来检查对象是否是一个空对象.

通过空对象我的意思是如果我做console.log(对象)它打印出{}.

我该怎么做呢?

coffeescript

13
推荐指数
2
解决办法
1万
查看次数

强制NumPy ndarray在Cython中获取其内存的所有权

在接下来的回答"我可以强迫一个numpy ndarray获取其记忆的所有权吗?" 我尝试PyArray_ENABLEFLAGS通过Cython的NumPy包装器使用Python C API函数,发现它没有暴露.

以下尝试手动公开它(这只是重现故障的最小示例)

from libc.stdlib cimport malloc
import numpy as np
cimport numpy as np

np.import_array()

ctypedef np.int32_t DTYPE_t

cdef extern from "numpy/ndarraytypes.h":
    void PyArray_ENABLEFLAGS(np.PyArrayObject *arr, int flags)

def test():
    cdef int N = 1000

    cdef DTYPE_t *data = <DTYPE_t *>malloc(N * sizeof(DTYPE_t))
    cdef np.ndarray[DTYPE_t, ndim=1] arr = np.PyArray_SimpleNewFromData(1, &N, np.NPY_INT32, data)
    PyArray_ENABLEFLAGS(arr, np.NPY_ARRAY_OWNDATA)
Run Code Online (Sandbox Code Playgroud)

失败并出现编译错误:

Error compiling Cython file:
------------------------------------------------------------
...
def test():
    cdef int N = 1000

    cdef DTYPE_t *data = <DTYPE_t *>malloc(N …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy cython

13
推荐指数
3
解决办法
2546
查看次数

使用数组成员包装C结构以便在python中访问:SWIG?用Cython?ctypes的?

我想访问一个C函数,它返回一个包含double数组的结构(其中这些数组的长度由结构的其他int成员给出)来自python.声明是

typedef struct {
  int dim;
  int vertices;
  int quadrature_degree;
  int polynomial_degree;
  int ngi;
  int quadrature_familiy;
  double *weight; /* 1D: ngi */
  double *l;      /* 2D: ngi * dim */
  double *n;      /* 2D: ngi * vertices */
  double *dn;     /* 3D: ngi * vertices * dim */
} element;

extern void get_element(int dim, int vertices, int quad_degree, int poly_degree, element* e);
Run Code Online (Sandbox Code Playgroud)

重要的是我希望能够以double*正确形状的NumPy数组访问所有成员(即dn应该可以作为3D数组访问).

简单地SWIG包装这给了我很好的结构,但所有double*成员都<Swig Object of type 'double *' at 0x348c8a0>使它们无用.我玩过NumPy SWIG接口文件,但无法使任何类型的图像 …

c python swig struct cython

12
推荐指数
2
解决办法
3587
查看次数

为什么Firefox有时会缓存我的CSS和Javascript代码,即使它已经改变了?

在我的产品网站上,Firefox有时会"检测不到"我的CSS和Javascript代码中的更改.而是它加载旧版本,所以我似乎需要清除缓存.在这种情况下,我该怎么办?这与最新的Firefox(撰写本文时为16.0.1)有关.

编辑!

我忘了说localhost css文件的错误.我的意思是,这是一个旧的js文件,我更新它,上传它,并在产品服务器上firefox认为它是localhost文件.我包含文件的方式:

<link rel="stylesheet" href="/xyz.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

html css browser caching assets

6
推荐指数
2
解决办法
4244
查看次数