小编cru*_*rky的帖子

asyncio.ensure_future与BaseEventLoop.create_task对比简单的协同程序?

我已经看过几个关于asyncio的基本Python 3.5教程,它们以各种方式执行相同的操作.在这段代码中:

import asyncio  

async def doit(i):
    print("Start %d" % i)
    await asyncio.sleep(3)
    print("End %d" % i)
    return i

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)]
    #futures = [loop.create_task(doit(i)) for i in range(10)]
    futures = [doit(i) for i in range(10)]
    result = loop.run_until_complete(asyncio.gather(*futures))
    print(result)
Run Code Online (Sandbox Code Playgroud)

上面定义futures变量的所有三个变体都实现了相同的结果; 我能看到的唯一区别是,对于第三个变体,执行是乱序的(在大多数情况下这应该无关紧要).还有其他区别吗?有些情况下我不能只使用最简单的变体(协程的简单列表)吗?

python coroutine python-3.x python-asyncio python-3.5

81
推荐指数
3
解决办法
4万
查看次数

cpython vs cython vs numpy array performance

我正在对http://docs.cython.org/src/tutorial/numpy.html上的素数生成器的变体进行一些性能测试.以下性能测量值为kmax = 1000

纯Python实现,在CPython中运行:0.15s

纯Python实现,在Cython中运行:0.07s

def primes(kmax):
    p = []
    k = 0
    n = 2
    while k < kmax:
        i = 0
        while i < k and n % p[i] != 0:
            i = i + 1
        if i == k:
            p.append(n)
            k = k + 1
        n = n + 1
    return p
Run Code Online (Sandbox Code Playgroud)

纯Python + Numpy实现,在CPython中运行:1.25s

import numpy

def primes(kmax):
    p = numpy.empty(kmax, dtype=int)
    k = 0
    n = 2
    while k < kmax:
        i = …
Run Code Online (Sandbox Code Playgroud)

python numpy cython

16
推荐指数
3
解决办法
3177
查看次数

Sphinx:ivar标签寻找交叉引用

我想用Sphinx记录Python对象属性.我明白我应该用

:ivar varname: description
:ivar type varname: description
Run Code Online (Sandbox Code Playgroud)

但是我看到了一个奇怪的行为,那就是Sphinx在我的项目中搜索变量名并尝试创建符号链接.例如这段代码:

class A(object):
    """
    :ivar x: some description
    """
    def __init__(self, x):
        self.x = x

class B(object):
    def x(self):
        return 1

class C(object):
    def x(self):
        return 2
Run Code Online (Sandbox Code Playgroud)

会导致此错误:

mylibrary.module1.A的module1.py:docstring:无:警告:找到多个目标为交叉引用u'x':mylibrary.module1.Cx,mylibrary.module1.Bx

我是否错误地理解了:ivar的目的或用法?

python documentation python-sphinx

15
推荐指数
2
解决办法
1686
查看次数

例外的"恢复下一步"的Pythonic方式?

问题:我正在阅读一系列异构输入文件.我为每个人编写了一个阅读器类,使用它来读取文件__init__(self, file_name),并在输入格式错误时抛出异常.

代码如下所示:

clients              = Clients             ('Clients.csv'             )
simulation           = Simulation          ('Simulation.csv'          )
indicators           = Indicators          ('Indicators.csv'          )
legalEntity          = LegalEntity         ('LegalEntity.csv'         )
defaultPortfolio     = DefaultPortfolio    ('DefaultPortfolio.csv'    )
excludedProductTypes = ExcludedProductTypes('ExcludedProductTypes.csv')
Run Code Online (Sandbox Code Playgroud)

问题是我不想死在第一个格式错误的文件,而是阅读所有这些文件然后如果至少有一个文件格式错误则会死亡.我能找到的唯一方法看起来很可怕:

my errors = []    

try:
    clients              = Clients             ('Clients.csv'             )
except Exception, e:
    errors.append(e)
try:
    simulation           = Simulation          ('Simulation.csv'          )
except Exception, e:
    errors.append(e)
try:
    indicators           = Indicators          ('Indicators.csv'          )
except Exception, e:
    errors.append(e)
try:
    legalEntity          = LegalEntity         ('LegalEntity.csv'         )
except Exception, e:
    errors.append(e)
try:
    defaultPortfolio …
Run Code Online (Sandbox Code Playgroud)

python exception-handling exception

8
推荐指数
2
解决办法
2764
查看次数

发电机的python发电机?

我写了一个读取txt文件的类.该文件由非空行块组成(让我们称之为"部分"),由空行分隔:

line1.1
line1.2
line1.3

line2.1
line2.2
Run Code Online (Sandbox Code Playgroud)

我的第一个实现是读取整个文件并返回列表列表,这是一个列表列表,其中每个部分是一个行列表.这显然是非常可怕的记忆.

所以我重新将它作为列表生成器实现,即在每个循环中,我的类将内存中的整个部分作为列表读取并生成它.

这样更好,但在大型部分的情况下仍然存在问题.所以我想知道我是否可以重新实现它作为发电机的发电机?问题是这个类非常通用,它应该能够满足这两个用例:

  1. 读取一个非常大的文件,包含非常大的部分,并只循环一次.发电机的发电机是完美的.
  2. 将一个小文件读入内存,以便多次循环.列表生成器工作正常,因为用户可以只调用

    列表(MyClass的(file_handle))

但是,生成器的生成器在情况2中不起作用,因为内部对象不会转换为列表.

有没有比实现一个显式的to_list()方法更优雅的东西,它会将生成器的生成器转换为列表列表?

python yield list generator

8
推荐指数
1
解决办法
5883
查看次数

opencl最佳组大小

我在OpenCL上运行mandelbrot生成器(来自静态参数的2D图像).该计划很简单:

__kernel
void mandelbrot(__global uchar * output, 
                const float xstep,
                const float xoffset,
                const float ystep,
                const float yoffset,
                const int maxiter)
{
    int gid_y = get_global_id(1);
    int gid_x = get_global_id(0);

    //calculate x and y on the fly for every pixel. 
    //This is just as fast as reading precalculated rulers from global memory.
    float x = gid_x * xstep + xoffset;
    float y = gid_y * ystep + yoffset;

    float real = 0;
    float imag = 0;

    int out = …
Run Code Online (Sandbox Code Playgroud)

opencl

7
推荐指数
1
解决办法
6859
查看次数

Debug the CPython opcode stack

CPython 3.7 introduced the ability to step through individual opcodes in a debugger. However, I can't figure out how to read variables out of the bytecode stack.

For example, when debugging

def f(a, b, c):
    return a * b + c

f(2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

I want to find out that the inputs of the addition are 6 and 4. Note how 6 never touches locals().

So far I could only come up with the opcode information, but I don't …

python cpython pdb

7
推荐指数
1
解决办法
144
查看次数

在调用方法之前检测方法是否已装饰

我编写了一个Python流控制框架,其工作方式非常类似unittest.TestCase:用户创建一个派生自框架类的类,然后编写自定义task_*(self)方法.框架发现它们并运行它们:

###################
# FRAMEWORK LIBRARY
###################
import functools

class SkipTask(BaseException):
    pass

def skip_if(condition):
    def decorator(task):
        @functools.wraps(task)
        def wrapper(self, *args, **kargs):
            if condition(self):
                raise SkipTask()
            return task(self, *args, **kargs)
        return wrapper
    return decorator

class MyFramework(object):
    def run(self):
        print "Starting task"
        try:
            self.task()
        except SkipTask:
            print "Skipped task"
        except Exception:
            print "Failed task"
            raise
        else:
            print "Finished task"

#############
# USER SCRIPT
#############
class MyUserClass(MyFramework):
    skip_flag = True

    @skip_if(lambda self: self.skip_flag)
    def task(self):
        print "Doing something"

if __name__ …
Run Code Online (Sandbox Code Playgroud)

python decorator python-decorators

6
推荐指数
1
解决办法
370
查看次数

调试 CPython 内存碎片

我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了

  1. 运行 gc.collect()
  2. 使用 pympler 发现所有已知的 Python 对象
import gc
import psutil
from pympler import muppy, summarize

gc.collect()
total_ram = psutil.Process().memory_info().rss
all_objects = muppy.get_objects(include_frames=True)
s = summary.summarize(all_objects)
python_objects_size = sum(row[2] for row in s)
Run Code Online (Sandbox Code Playgroud)

输出:102 MiB Python 对象,824 MiB RSS 内存!

[编辑] 3. 使用 tracemalloc; 它还返回价值约 100MiB 的 Python 对象

[编辑 2]export PYTHONMALLOC=malloc没有解决问题。

有没有办法查询 CPython 内存管理器来找出

  • 它持有多少 RAM,以便我可以从 RSS 中减去它并找出是否有任何未使用 PyMem_Malloc 并且正在泄漏的 C 库
  • 为什么它持有内存(例如,由于一个 20 字节的 PyObject 仍在被引用,因此发现它持有一个 64kb 的页面)
  • 识别调用 PyMem_Malloc …

python garbage-collection

6
推荐指数
1
解决办法
219
查看次数

处理异步死锁

此示例代码无限期挂起:

import asyncio


async def main():
    async def f():
        await g_task

    async def g():
        await f_task

    f_task = asyncio.create_task(f())
    g_task = asyncio.create_task(g())
    await f_task


asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种自动检测和处理死锁的方法,就像 GoLang 那样。

到目前为止,我想出了一个变体asyncio.wait_for()

[编辑] 大修设计

https://gist.github.com/gimperiale/549cbad04c24d870145d3f38fbb8e6f0

原始代码中的 1 行更改:

await wait_check_deadlock(f_task)
Run Code Online (Sandbox Code Playgroud)

它有效,但有两个主要问题:

  1. 它依赖于asyncio.Task._fut_waiter,这是 CPython 的一个实现细节
  2. 死锁的任务将永远保留在 RAM 中。aw.cancel()似乎什么都不做。如果我捕捉到辅助函数引发的 RecursionError,asyncio.run() 在尝试取消所有任务时会引发另一个 RecursionError。

是否有更强大的解决方案?

python-asyncio

5
推荐指数
1
解决办法
1323
查看次数

交错DDL和DML时是否需要COMMIT?

在Oracle中,我正在调用以下查询(而不是来自sqlplus)作为安装脚本的一部分:

ALTER TABLE MYTABLE DISABLE CONSTRAINT PFTATTRS_ATTR_FK;
INSERT INTO MYTABLE (PTF_ID, ATTR_ID) VALUES (1, 5);
ALTER TABLE MYTABLE ENABLE CONSTRAINT PFTATTRS_ATTR_FK;
Run Code Online (Sandbox Code Playgroud)

如您所见,我将DML(需要COMMIT)与DDL(自动提交)交错.我的疑问是:我是否需要在每个DDL之前提交DML,或者在我的脚本结尾处进行一次大提交是否安全?

oracle ddl transactions commit dml

0
推荐指数
1
解决办法
183
查看次数