我在这里问,因为到目前为止我还没有得到OpenCV开发人员的任何帮助.我把问题简化为一个非常简单的测试用例,所以可能有CPython背景的人都可以在这里提供帮助.
这个C代码不泄漏:
int main() {
while(true) {
int hist_size[] = {40};
float range[] = {0.0f,255.0f};
float* ranges[] = {range};
CvHistogram* hist = cvCreateHist(1, hist_size, CV_HIST_ARRAY, ranges, 1);
cvReleaseHist(&hist);
}
}
Run Code Online (Sandbox Code Playgroud)
这个Python代码确实泄漏:
while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
Run Code Online (Sandbox Code Playgroud)
我搜索了CPython代码(OpenCVs当前的SVN中继代码),发现了这个:
struct cvhistogram_t {
PyObject_HEAD
CvHistogram h;
PyObject *bins;
};
Run Code Online (Sandbox Code Playgroud)
...
/* cvhistogram */
static void cvhistogram_dealloc(PyObject *self)
{
cvhistogram_t *cvh = (cvhistogram_t*)self;
Py_DECREF(cvh->bins);
PyObject_Del(self);
}
static PyTypeObject cvhistogram_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvhistogram", /*name*/
sizeof(cvhistogram_t), /*basicsize*/
};
static PyObject *cvhistogram_getbins(cvhistogram_t *cvh) …Run Code Online (Sandbox Code Playgroud) 我试图了解CPython的GIL如何工作以及CPython 2.7.x和CPython 3.4.x中GIL之间的区别是什么.我正在使用此代码进行基准测试:
from __future__ import print_function
import argparse
import resource
import sys
import threading
import time
def countdown(n):
while n > 0:
n -= 1
def get_time():
stats = resource.getrusage(resource.RUSAGE_SELF)
total_cpu_time = stats.ru_utime + stats.ru_stime
return time.time(), total_cpu_time, stats.ru_utime, stats.ru_stime
def get_time_diff(start_time, end_time):
return tuple((end-start) for start, end in zip(start_time, end_time))
def main(total_cycles, max_threads, no_headers=False):
header = ("%4s %8s %8s %8s %8s %8s %8s %8s %8s" %
("#t", "seq_r", "seq_c", "seq_u", "seq_s",
"par_r", "par_c", "par_u", "par_s"))
row_format = ("%(threads)4d …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照本教程在 python 中使用 C 代码。http://dfm.io/posts/python-c-extensions/
这是要点https://gist.github.com/GreenJoey/b08528d6abe62da70f28f73c39c0efd0
当我尝试使用它进行编译时,python setup.py build_ext --inplace它失败并显示以下错误消息:
running build_ext
No module named 'numpy.distutils._msvccompiler' in numpy.distutils; trying from distutils
building '_chi2' extension
creating build\temp.win-amd64-3.6
creating build\temp.win-amd64-3.6\Release
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -IC:\Users\XXX\AppData\Local\Continuum\anaconda3\include -I"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tc_chi2.c /Fobuild\temp.win-amd64-3.6\Release\_chi2.obj
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo …Run Code Online (Sandbox Code Playgroud) 在任何地方,我都可以轻松找到有关使用Python C 扩展编写方法并在 Python 中使用它的示例。就像这个:Python 3 扩展示例
$ python3
>>> import hello
>>> hello.hello_world()
Hello, world!
>>> hello.hello('world')
Hello, world!
Run Code Online (Sandbox Code Playgroud)
如何编写一个 hello word 全功能 Python 类(而不仅仅是一个模块方法)?
我认为这How towrapp a C++ object using pure Python Extension API (python3)? 问题有一个例子,但它似乎并不小,因为他在上面使用(或包装?)C++ 类。
例如:
$ python3
>>> import hello
>>> hello.hello_world()
Hello, world!
>>> hello.hello('world')
Hello, world!
Run Code Online (Sandbox Code Playgroud)
这个带有 C 扩展的 Python 类示例的等价物是什么?
我会这样使用它:
from .mycextensionsmodule import ClassName
classname = ClassName("Hello")
classname.talk( 'world!' )
# prints "Hello world!"
Run Code Online (Sandbox Code Playgroud)
我的目标是编写一个完全用 C 编写的类以提高性能(我的项目中的所有其他类都将使用 Python,除了这个)。我并不是在寻找使用 …
我想了解以下之间的区别:
try:
raise Exception("wat")
except Exception:
extype, exc, tb = sys.exc_info()
traceback.print_exception(extype, exc, tb)
Run Code Online (Sandbox Code Playgroud)
和:
try:
raise Exception("wat")
except Exception as exc:
extype = type(exc)
tb = exc.__traceback__
traceback.print_exception(extype, exc, tb)
Run Code Online (Sandbox Code Playgroud)
是否存在type(exc)和exc.__traceback__与 返回的值不同的情况sys.exc_info()?如果不是,我什么时候应该选择其中一种而不是另一种?当我对此进行测试时(Python 3.7),返回的对象在引用上是相同的。
查看 CPython 中的实现exc_info(),第一个返回值(异常类型)似乎是通过调用PyExceptionInstance_Class获得的,这与type(exc). 但是,我无法找到如何设置回溯。
(FWIW我知道速记traceback.print_exc(),这与这个问题无关)
Python 3.8 引入了PEP 578——Python 运行时审计挂钩,它承诺“使 Python 运行时采取的操作对审计工具可见”。
此 pep 提供了一些用例,这些用例似乎主要与系统管理员、安全专业人员和测试框架贡献者相关。然而,据我所知,这需要在选择的 python 实现上进行一些自定义选项。但是,我无法在网上找到太多信息来记录如何设置这些选项或哪些选项可用于在哪个实现中实现。
我如何开始在 cpython 中使用这些钩子?当前可用的所有钩子的完整列表在哪里(不建议实施)?
我使用了一个程序来绘制曼德布罗图,并使用 njit 让它在 CPU 线程上运行。现在我想生成一个 32k 的图像,但即使是整个线程也太慢了。所以我试图让代码在 GPU 上运行。这是代码:
from numba import njit, cuda, vectorize
from PIL import Image, ImageDraw
@vectorize(['complex128(complex128)'], target='cuda')
def mandelbrot(c):
z = 0
n = 0
while abs(z) <= 2 and n < 80:
z = z*z + c
n += 1
return n
def vari(WIDTH, HEIGHT, RE_START, RE_END, IM_START, IM_END, draw):
for x in range(0, WIDTH):
for y in range(0, HEIGHT):
print(x)
# Convert pixel coordinate to complex number
c = complex(RE_START + (x / …Run Code Online (Sandbox Code Playgroud) 我正在经历python 语法规范并找到以下语句
\n\nfor_stmt:\n | \'for\' star_targets \'in\' ~ star_expressions \':\' [TYPE_COMMENT] 块 [else_block]\n\n
~这个语法规则是什么意思?语法中使用的其他符号(如&, !, |)已记录但尚未记录~。
\n\n\n
EBNF该符号是和的混合PEG。特别是,&后面跟有符号、标记或括号组表示正向先行(即需要匹配但不消耗),而!表示负向先行(即不需要匹配)。我们\n使用|分隔符来表示 PEG\xe2\x80\x99s \xe2\x80\x9cordered choice\xe2\x80\x9d (写为/传统 PEG 语法编写)
假设我使用 C 扩展 API 实现了两种 Python 类型,并且这些类型是相同的(相同的数据布局/C struct),除了它们的名称和一些方法之外。假设所有方法都遵循数据布局,您可以在 C 函数中安全地将对象的类型从其中一种类型更改为另一种类型吗?
值得注意的是,从 Python 3.9 开始,似乎有一个 function Py_SET_TYPE,但文档并不清楚是否/何时可以安全地执行此操作。我有兴趣了解如何安全地使用此函数以及在 3.9 版本之前是否可以安全地更改类型。
我正在编写一个 Python C 扩展来实现持久哈希数组映射 Trie (PHAMT);如果它有用,源代码在这里(截至撰写本文时,它位于此提交)。我想添加的一个功能是能够从 PHAMT 创建瞬态哈希数组映射 Trie (THAMT)。THAMT 可以及时从 PHAMT 中产生O(1),并且可以有效地就地突变。重要的是,THAMT 与 PHAMT\xe2\x80\x94 具有完全相同的底层C 数据结构。PHAMT和 THAMT 之间的唯一真正区别是它们的 Python 类型封装的一些方法。这种通用结构允许人们在完成一组编辑后非常有效地将 THAMT 转换回 PHAMT。(当对 PHAMT 执行大量更新时,此模式通常会减少内存分配的数量)。
实现从 THAMT 到 PHAMT 的转换的一种非常方便的方法是简单地将 THAMT 对象的类型指针从 THAMT 类型更改为 PHAMT 类型。我相信我可以编写安全地导航此更改的代码,但我可以想象这样做可能会破坏 Python 垃圾收集器。
\n(需要明确的是:动机只是问题如何产生的背景。我不是在寻求实现动机中描述的结构的帮助, …
在 CPython 3.11 中,以下代码返回某些对象的非常大的引用计数。它似乎遵循预缓存的对象,例如整数 -5 到 256,但 CPython 3.10 不遵循:
Python 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for i in (-6, -5, 0, 255, 256, 257):
... print(i, sys.getrefcount(i))
...
-6 5
-5 1000000004
0 1000000535
255 1000000010
256 1000000040
257 5
Run Code Online (Sandbox Code Playgroud)
Python 3.10.8 (tags/v3.10.8:aaaf517, Oct 11 2022, 16:50:30) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" …Run Code Online (Sandbox Code Playgroud) cpython ×10
python ×9
python-3.x ×2
python-c-api ×2
c ×1
class ×1
cuda ×1
debugging ×1
ebnf ×1
exception ×1
gil ×1
memory-leaks ×1
numba ×1
opencv ×1
parsing ×1
peg ×1
python-3.11 ×1
types ×1