小编Han*_*ave的帖子

在 Zig 中,如何判断一个帧是否代表一个完全执行的函数?

在 Zig(当前使用 0.7.1)中,假设由于某种原因您没有任何好的方法来设计resume对于每个suspend. 是否有任何支持的方法可以在运行时检测给定的帧是否已执行完成?

// overly simplistic example designed to illustrate the problem
pub fn main() void {
    var frame = async amain(2);
    resume frame;
    resume frame;

    // panic/UB -- resume async function which already returned
    // 
    // we would prefer to have some kind of check which could allow
    // us to detect at runtime that the following resumption is illegal
    resume frame;
}

fn amain(ubound: i32) void {
    var i: i32 = 0;
    while …
Run Code Online (Sandbox Code Playgroud)

zig

9
推荐指数
1
解决办法
267
查看次数

在给定测地线的成对距离矩阵的情况下,哪些算法可用于生成流形的欧几里德嵌入?

我有一个方形矩阵D(目前表示为一个形状为numpy的阵列(572,572)),似乎对应于沿大致圆柱形物体表面的点之间的成对距离.即,该值D[i,j]对应于沿该空心圆柱体表面的任何路径的最小长度.如何构建这些572个点的三维(或n维)嵌入欧几里德空间,以保留那些测地距离?

目前的尝试

局部线性嵌入isomap等算法能够采用成对测地距离的矩阵并输出嵌入,以便成对的欧氏距离与原始测地线相同.虽然这通常不是同一个任务,但是在输出碰巧接近某个维度的超立方体的情况下,实际发生了所需的变换(考虑瑞士卷),因为嵌入本身就是一个流形,因此欧几里德距离对应于测地线距离.

对于像气缸这样稍微复杂的物体,情况并非如此.通过将测地距离视为欧几里德,期望圆柱上的对映点被映射到彼此远离期望的位置,并且相应的全局优化问题将经常导致分支结构,其中分支的末端对应于最远的对映点,放大气缸随机采样中的小扰动.通常,这些算法的天真应用似乎并不能解决手头的问题.

另一种有点富有成效(虽然昂贵)的方法是一种粗暴的蒙特卡罗技术.我从具有不同参数的管状物体中生成随机样本,直到我找到一组参数生成与我的类似的测地距离矩阵,直到排列(通过求解将该距离矩阵转换为采矿和测试的线性系统处理效率不是太低)查看结果是否接近排列矩阵).然后通过找到与上述近置换矩阵最接近的置换矩阵来执行从我的572点到保持成对距离的对象的近似最佳映射.

这会产生合理的结果,但它预先假定数据的形状并且非常昂贵.我已经执行了一些更明显的优化,比如使用小的随机样本而不是整个数据集,并使用基于梯度的技术进行参数估计,但更通用的技术会很好.

注意事项

这个问题当然没有一个独特的解决方案.即使假设可以通过有限均匀采样在3空间中明确地识别流形,也只是压缩圆柱体产生具有相同测地线和不同欧氏距离的形状(因此不同的嵌入).这不会比LLE和Isomap产生不同的解决方案更让我困扰,我会对任何合理的答案都很好.

关于从有限样本中唯一地识别流形,为了论证,我可以很好地使用来自包中dist_matrix_的拟合Isomap类的属性scikit-learn而没有任何特殊参数来找到测地线.这是一个不必要的MDS步骤,但它并不是非常昂贵,而且开箱即用.然后我们想要一个嵌入,它最小化原始测地距离矩阵和dist_matrix_属性之间的frobenius距离.

python algorithm numpy matrix scikit-learn

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

sys.version_info 对于 Python 版本检查是否可靠?

如果我做了一个模块,我想作为在Python 3运行在Python 2相同,有一吨的选项包括sixfutures,和2to3。如果更改的数量很少,那么这些工具中的每一个都有足够的怪癖,我倾向于只为我的模块实际使用的少数不兼容功能编写兼容接口。

实现这一点的合理标准方法是使用简单的版本检查。

import module_bar

if sys.version_info >= (3,):
    uniformly_named_foo = module_bar.py3_thing
else:
    uniformly_named_foo = module_bar.py2_thing
Run Code Online (Sandbox Code Playgroud)

是否有任何奇怪的情况sys.version_info不会正确报告?过去,我已经被格式错误的路径、配置、安装、修改以及诸如此类的东西所困扰,以至于我觉得这不是我应该信任的事情。

当我们深入研究它时,我真正关心的是是否实现了特定功能。在 Web 开发中,嗅探用户代理通常被认为是一种不好的做法。相反,应该尽最大努力确定某个特定功能是否正在使用中。根据功能的不同,有很多方法可以实现这一点。

if hasattr(module_bar, 'py3_thing'):
    uniformly_named_foo = module_bar.py3_thing
else:
    uniformly_named_foo = module_bar.py2_thing
Run Code Online (Sandbox Code Playgroud)

在我的机器上,第二条路线慢两倍(对于一次性操作来说,额外的几百纳秒并不重要),但它似乎没有任何其他主要缺点。还是有优势?是否存在第二种方法会成功而第一种方法会失败的 Python 安装?

python python-2.7 python-3.x

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

如何快速找到连接到二部图子集的所有节点?

给定一组左节点和右节点,以及它们之间的边(二分图),我需要支持从左节点集到连接到左侧任何内容的右节点子集的快速查找。

如果图形非常稀疏或密集,这很容易。下面是一个示例邻接表实现,它将支持connected_endpoints()稀疏图上的快速调用。O(len(input) * len(result))然而,对于中等数量的连接,尽管涉及的数据大小表明可能存在解决方案,但中间计算看起来像是这样O(len(input) + len(result))

是否存在一种数据结构可以相对快速地支持这 3 个操作(或类似的操作)——添加/删除可能为 O(1),连接边搜索为 O(in+out),给出或采用多对数因子?

from typing import *
from collections import defaultdict

A = TypeVar('A')
B = TypeVar('B')

class Graph(Generic[A, B]):
    def __init__(self):
        self.edges = defaultdict(set)
    
    def set_edge(self, start: A, end: B):
        """Desired: Amortized O(1)"""
        self.edges[start].add(end)
    
    def unset_edge(self, start: A, end: B):
        """Desired: Amortized O(1)"""
        s = self.edges[start]
        s.discard(end)
        if not s:
            self.edges.pop(start, None)

    def connected_endpoints(self, start: Set[A]) -> Set[B]:
        """Desired: Amortized O(len(start) + len(<return>))"""
        empty = …
Run Code Online (Sandbox Code Playgroud)

python algorithm math graph-theory

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

为什么非函数可调用对象不绑定到类实例?

假设我们有一个要进行猴子补丁的类以及一些我们想对其进行猴子补丁的可调用对象。

class Foo:
  pass

def bar(*args):
  print(list(map(type, args)))

class Baz:
  def __call__(*args):
    print(list(map(type, args)))
baz = Baz()

def wrapped_baz(*args):
  return baz(*args)

Foo.bar = bar
Foo.baz = baz
Foo.biz = wrapped_baz

Foo().bar()  # [<class '__main__.Foo'>]
Foo().baz()  # [<class '__main__.Baz'>]
Foo().biz()  # [<class '__main__.Baz'>, <class '__main__.Foo'>]
Run Code Online (Sandbox Code Playgroud)

即使baz是可调用的,它也不会绑定到Foo()两个函数bar和的实例wrapped_baz。由于Python是鸭子式语言,因此给定可调用类型在对象机制的行为中起着举足轻重的作用,这似乎很奇怪。

并不是说包装可调用对象不一定是坏方法,还有其他方法可以将可调用对象适当地绑定到Foo实例吗?这是CPython实现的一个怪癖,还是语言规范的一部分描述了观察到的行为?

python methods class python-3.x python-internals

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

asyncio 的默认调度程序什么时候公平?

据我了解,目的是同时asyncio.gather运行其参数,并且当协程执行等待表达式时,它为事件循环提供了安排其他任务的机会。考虑到这一点,我惊讶地发现以下代码片段忽略了.asyncio.gather

import asyncio                                                             
  
async def aprint(s):
    print(s)

async def forever(s):
    while True:
        await aprint(s)

async def main():
    await asyncio.gather(forever('a'), forever('b'))

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

据我了解,会发生以下情况:

  1. asyncio.run(main()) 对事件循环进行任何必要的全局初始化并安排 main() 执行。
  2. main() 安排 asyncio.gather(...) 执行并等待其结果
  3. asyncio.gather 安排forever('a') 和forever('b') 的执行
  4. 无论其中哪一个先执行,它们都会立即等待 aprint() 并让调度程序有机会在需要时运行另一个协程(例如,如果我们从“a”开始,那么我们就有机会开始尝试评估“b”,这应该已安排执行)。
  5. 在输出中,我们将看到一串行,每行都包含“a”或“b”,并且调度程序应该足够公平,以便我们在足够长的时间内至少看到其中的一行。

实际上,这不是我所观察到的。相反,整个程序相当于while True: print('a'). 我发现非常有趣的是,即使对代码进行微小的更改似乎也会重新引入公平性。例如,如果我们使用以下代码,那么我们会在输出中得到大致相等的“a”和“b”混合。

async def forever(s):
    while True:
        await aprint(s)
        await asyncio.sleep(1.)
Run Code Online (Sandbox Code Playgroud)

验证它似乎与我们在无限循环中和在无限循环外花费的时间没有任何关系,我发现以下更改也提供了公平性。

async def forever(s):
    while True:
        await aprint(s)
        await asyncio.sleep(0.)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会发生这种不公平现象以及如何避免它?我想,当有疑问时,我可以主动在各处添加一个空的睡眠语句,并希望这足够了,但对我来说,为什么原始代码的行为不符合预期,这对我来说非常不明显。

以防万一,因为 asyncio 似乎已经经历了相当多的 API 更改,我在 Ubuntu 机器上使用 Python 3.8.4 的普通安装。

python python-asyncio

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

如何修改Python中def的行为?

Python 中的大多数内容都很容易修改,包括能够使用您最喜欢的代码对象直接通过 Types.FunctionType 实例化函数。并不是说人们必须这样做,但作为一种学习经验,我试图弄清楚如何defPython本身内部修改行为(修改语言定义感觉像是在作弊)。

对于类,这可以在 3.1+ 中使用钩子相当容易地完成__build_class__是否有类似的机制用于挂钩函数构建?

到目前为止,我已经尝试修改、、、、、compile()以及在我能找到eval()的任何exec()地方看起来相关的任何其他内容。据我所知,当它创建函数对象并将其加载到. 尽可能详细地说明,当我们定义函数时到底会发生什么?整个过程是在底层C代码中在幕后完成的吗?type()Types.FunctionTypedefglobals()

python metaprogramming

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

在Python中覆盖"点"运算符是不好的形式?

通常,Python中的句点表示类成员身份:

class A:
    a = 1

>>> A.a
1
Run Code Online (Sandbox Code Playgroud)

有时,语言似乎不够灵活,无法从计算机科学以外的领域完全表达一个想法.考虑下面的例子(为了简洁起见,相当简单)使用相同的运算符看起来像完全不同的东西.

class Vector:
    def __init__(self, data):
        self.data = list(data)

    def dot(self, x):
        return sum([a*b for a, b in zip(self.data, x.data)])

    def __getattr__(self, x):
        if x == 'Vector':
            return lambda p: self.dot(Vector(p))
        return self.dot(globals()[x])
Run Code Online (Sandbox Code Playgroud)

在这里我们已经接管了,__getattr__()以便在Python尝试从我们的向量中找到属性的许多场景中,它改为计算数学点积.

>>> v = Vector([1, 2])
>>> v.Vector([3, 4])
11

>>> v.v
5
Run Code Online (Sandbox Code Playgroud)

如果这种行为的范围受限于感兴趣的领域,那么这种设计模式是否有任何问题?

python syntax design-patterns

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