您将使用什么来建立全新的跨平台GUI应用程序CPython或IronPython?
那么
- 许可证/自由
- 开发
- - 文档
- 编辑器
- 工具
- 库
- 性能
- 可移植性
你能用哪一个做得最好?
- 网络
- 数据库
- GUI
- 系统
- 多线程/处理
我在这里问,因为到目前为止我还没有得到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) 我正在研究Python的文档API我正在调用Python Docs,我注意到我的静态分析套件几乎无法访问所有内置函数,因为它们几乎都是C模块.据我所知,我不能想到这条规则有任何例外.
我的问题的第一部分很简单,是否内置模块预先假定是CPython中的C扩展?
假设可能是这种情况,我编译了一个新的pypy运行时,并尝试使用我的项目来反对pypy的内置函数.我惊讶地发现这也不起作用.
为什么PyPy模块不是AST对象,如果它们是纯Python?这是PyPy在JIT上托管的副作用吗?
我正在尝试将Python用于运行Linux的Arm处理器上的嵌入式应用程序(从X86/Linux交叉编译的CPython 2.7.3).在我开始确保设备安全以防止篡改之前,它确实运行良好.首先,我将rootfs设置为只读,以防止rootfs因突然断电而损坏,并防止未经授权的用户修改我们的主代码.仍然,python和我们的ctypes库继续正常工作./ tmp目录被映射到tmpfs(ramdrive).强化的另一个步骤是在tmpfs分区上设置noexec标志,以防止用户以某种方式上传任何可能导致本地root利用的代码.设置了这两个选项后,导入ctypes会立即产生段错误:
root@ATX4:~# python
Python 2.7.3 (default, Jul 16 2013, 17:15:57)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
有趣的是,下面的任何更改都允许ctypes正常工作:
知道是什么导致了这个吗?现在,我已经在没有noexec的情况下进行了/ dev/shm mount,并且只是将其限制为尽可能少的用户.
我试图了解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) 由于GIL,我认为多线程python进程一次只能运行一个线程,因此cpu使用率不能超过100%.
但我发现下面的代码可以占用顶部950%的CPU使用率.
import threading
import time
def f():
while 1:
pass
for i in range(10):
t = threading.Thread(target=f)
t.setDaemon(True)
t.start()
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
这与Python解释器使用高达130%的CPU的问题不同.怎么可能?.在那个问题中,OP表示他正在进行I/O密集型负载测试,这可能会释放GIL.但在我的程序中,没有I/O操作.
测试在CPython 2.6.6上运行.
有人可以解释CPython 2.7中字典的非单调内存使用吗?
>>> import sys
>>> sys.getsizeof({})
280
>>> sys.getsizeof({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5})
280
>>> sys.getsizeof({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6})
1048
>>> sys.getsizeof({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7})
1048
>>> sys.getsizeof({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'e
ight': 8})
664
>>> sys.getsizeof({'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个Web应用程序,它使用SqlAlchemy Flask和Marshmallow的组合将SQLite数据序列化为前端的JSON.我已经在多个场合使用过这种设置,但是,这次我的控制台不断被垃圾邮件发送,并出现以下错误:
Exception ignored in: <generator object surface_selectables at 0x13b399888>
Traceback (most recent call last):
File "/Users/luke/Documents/Projects/project/venv/lib/python3.6/site-packages/sqlalchemy/sql/util.py", line 231, in surface_selectables
yield elem
SystemError: error return without exception set
Exception ignored in: <generator object _visitor_iterator at 0x13b399888>
Traceback (most recent call last):
File "/Users/luke/Documents/Projects/project/venv/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py", line 150, in _visitor_iterator
yield v
SystemError: error return without exception set
Exception ignored in: <generator object _visitor_iterator at 0x13b399888>
Traceback (most recent call last):
File "/Users/luke/Documents/Projects/project/venv/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py", line 150, in _visitor_iterator
yield v
SystemError: error return …Run Code Online (Sandbox Code Playgroud) 我知道条件表达式(或三元运算符)在Python中是懒惰的.它们代表条件执行而不是条件选择.换句话说,以下只有一个a或被b评估:
c = a if condition else b
Run Code Online (Sandbox Code Playgroud)
我有兴趣知道它是如何在内部实现的.Python是否转换if为如下所示的语句,如果是,则转换发生在什么阶段?
if condition:
c = a
else:
c = b
Run Code Online (Sandbox Code Playgroud)
或者三元运算符实际上是一个独立且独立的表达式,完全单独定义?如果是这样,我可以访问条件表达式的CPython代码吗?
我看这解释以下什么三元运营商的做法,但他们没有明确如何得到实施:
编辑:您可以假设CPython参考实现.
为了查看repr(x)CPython中float的工作方式,我检查了以下代码float_repr:
buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
'r', 0,
Py_DTSF_ADD_DOT_0,
NULL);
Run Code Online (Sandbox Code Playgroud)
这会调用PyOS_double_to_string格式代码'r',该格式代码似乎已转换为'g'精度设置为17的格式代码:
precision = 17;
format_code = 'g';
Run Code Online (Sandbox Code Playgroud)
因此,我希望repr(x)并f'{x:.17g}'返回相同的表示形式。但是,情况似乎并非如此:
>>> repr(1.1)
'1.1'
>>> f'{1.1:.17g}'
'1.1000000000000001'
>>>
>>> repr(1.225)
'1.225'
>>> f'{1.225:.17g}'
'1.2250000000000001'
Run Code Online (Sandbox Code Playgroud)
我知道,repr仅需要返回与重构内存中所表示的相同对象相同数量的数字,因此'1.1'显然足以取回该数字,1.1但我想知道这与(内部使用)与(内部使用)有何不同(或为什么) ).17g格式选项。
(Python 3.7.3)
cpython ×10
python ×10
python-2.7 ×2
python-3.x ×2
built-in ×1
ctypes ×1
debugging ×1
gil ×1
ironpython ×1
memory ×1
memory-leaks ×1
opencv ×1
pypy ×1
sqlalchemy ×1
sqlite ×1