我已经看过几个关于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
变量的所有三个变体都实现了相同的结果; 我能看到的唯一区别是,对于第三个变体,执行是乱序的(在大多数情况下这应该无关紧要).还有其他区别吗?有些情况下我不能只使用最简单的变体(协程的简单列表)吗?
我正在对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) 我想用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的目的或用法?
问题:我正在阅读一系列异构输入文件.我为每个人编写了一个阅读器类,使用它来读取文件__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) 我写了一个读取txt文件的类.该文件由非空行块组成(让我们称之为"部分"),由空行分隔:
line1.1
line1.2
line1.3
line2.1
line2.2
Run Code Online (Sandbox Code Playgroud)
我的第一个实现是读取整个文件并返回列表列表,这是一个列表列表,其中每个部分是一个行列表.这显然是非常可怕的记忆.
所以我重新将它作为列表生成器实现,即在每个循环中,我的类将内存中的整个部分作为列表读取并生成它.
这样更好,但在大型部分的情况下仍然存在问题.所以我想知道我是否可以重新实现它作为发电机的发电机?问题是这个类非常通用,它应该能够满足这两个用例:
将一个小文件读入内存,以便多次循环.列表生成器工作正常,因为用户可以只调用
列表(MyClass的(file_handle))
但是,生成器的生成器在情况2中不起作用,因为内部对象不会转换为列表.
有没有比实现一个显式的to_list()方法更优雅的东西,它会将生成器的生成器转换为列表列表?
我在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) 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流控制框架,其工作方式非常类似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) 我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了
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 内存管理器来找出
此示例代码无限期挂起:
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)
它有效,但有两个主要问题:
asyncio.Task._fut_waiter
,这是 CPython 的一个实现细节aw.cancel()
似乎什么都不做。如果我捕捉到辅助函数引发的 RecursionError,asyncio.run() 在尝试取消所有任务时会引发另一个 RecursionError。是否有更强大的解决方案?
在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,或者在我的脚本结尾处进行一次大提交是否安全?