小编kla*_*ann的帖子

以编程方式删除Python源中的类型提示

我有一些为Python 3.5编写的源代码,我想在Python 3.4下创建可执行文件.我使用的3.5中唯一没有在3.4中提供的功能是类型提示,所以我想编写一个脚本来完全删除它们.

这看起来很容易乍一看我决定写一些正则表达式来做这个,但后来我考虑了一些边缘情况,我不知道如何解决这个更复杂的函数的问题:

def foo(bar: Dict[T, List[T]],
        baz: Callable[[T], int] = lambda x: (x+3)/7,
        **kwargs) -> List[T]:
Run Code Online (Sandbox Code Playgroud)

基本上,我必须解析整个事情并重建参数列表而不使用类型注释.我怎么会接近这个?

type-hinting python-3.x

12
推荐指数
2
解决办法
1204
查看次数

分析正在运行的 Python 进程的内存使用情况

我有一个 Python 进程,在很长一段时间(至少 10 小时,有时更长)后开始泄漏内存。这个问题很难重现,因此我想在问题出现时附加到正在运行的Python解释器,并以某种方式检查内存使用情况,例如通过获取当前分配最多内存的对象列表。

对于通常的分析工具(如tracemalloc内存分析器)来说,这是很困难的,因为它们需要成为代码的一部分或与进程一起启动,并且它们对运行时性能有重大影响。

我想要的是一个采样分析器,我可以简单地将其附加到现有的 Python 进程(如py-spy ),但 py-spy 只能让我了解函数中花费的 CPU 时间,而不是内存使用情况。

是否有其他工具或不同的方法可以帮助我深入了解现有 Python 进程的内存使用情况?

编辑:我刚刚找到了pyrasite,它提供了pyrasite-memory-viewer命令,这正是我正在寻找的,但不幸的是该项目似乎被放弃了,我无法让它在Python 3.8上工作。

python profiling memory-leaks python-3.x

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

在Java中推广for循环

我真的不知道如何描述我的问题,所以我只是展示一个代码示例:

int[][][] mat;
int n;
int specificValue;

for (int i = 0; i < n; i++) {
    if(mat[i][n-i][3] != specificValue) {
        doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在查找3d数组中的Integer值.对于每个领域,我必须使用以下其中一个:

  • 从零到n的计数器
  • 计数器从n运行到零
  • 一个固定的价值

所以我试图构建一个方法,可以避免我写这个循环大约20次,但我失败了,所以这就是我需要帮助的地方.我的想法是这样的:

search(Loop.UP, Loop.DOWN, Loop.FIXED);
Run Code Online (Sandbox Code Playgroud)

其中"Loop"将是一个表示我的可能性的枚举,但我不知道如何实现它,或者如果在Java中甚至可以在不对每种可能的组合进行硬编码的情况下实现它.

希望你能帮忙:)


好的,更具体的...我的设置我正在通过这个3d数组绘制一个矢量,一个特定的对角线,我想知道这个矢量上的值是什么,只有这个矢量.

并且因为绘制这样一个向量的可能性不止一个,我想有一个更通用的方法来获取这些值.我的搜索可能就像这样简单

search(Loop.UP, Loop.FIXED, Loop.FIXED);   // one plane
Run Code Online (Sandbox Code Playgroud)

这将是一个简单的for循环与一个计数器,但也

search(Loop.DOWN, Loop.UP, Loop.UP);   // through all three planes
Run Code Online (Sandbox Code Playgroud)

java for-loop multidimensional-array

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

如何从 geosparql 的 wktLiteral 检索纬度和经度?

我正在使用包含地理参考内容的 RDF 数据,例如具有指定位置的 POI:

@prefix ogc:   <http://www.opengis.net/ont/geosparql#> .

:poi  ogc:hasGeometry  :geo
:geo  ogc:asWKT        "POINT(48.5 11.7)"^^ogc:wktLiteral .
Run Code Online (Sandbox Code Playgroud)

所以有某种 POI 位于 (48.5, 11.7)。我可以使用GeoSPARQL查询来处理这些位置,但现在我想分别提取纬度和经度,因此我可以将其输入到不支持WKT的不同应用程序中。

SELECT ?lat ?lon
WHERE {
    # how do I get lat and lon from "POINT(48.5 11.7)"^^ogc:wktLiteral?
}
Run Code Online (Sandbox Code Playgroud)

我在OGC 的 GeoSPARQL 规范中没有找到任何有用的内容,因此我想知道在 SPARQL 查询中手动提取此类数据的最佳方法是什么。

rdf sparql geospatial

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

根据(估计的)功能量选择KBest

我正在尝试使用scikit-learn实现分层文本分类器,其中一个"根"分类器将所有输入字符串排列在~50个类别中的一个(或多个)中.对于这些类别中的每一个,我将训练一个新的分类器,它解决了实际的任务.

这种双层方法的原因是训练性能和内存问题(应该分离> 1k类的分类器表现不佳......).

这就是我的管道对于每个"子分类器"的看法

pipeline = Pipeline([
    ('vect', CountVectorizer(strip_accents=None, lowercase=True, analyzer='char_wb', ngram_range=(3,8), max_df=0.1)),
    ('tfidf', TfidfTransformer(norm='l2')),
    ('feat', SelectKBest(chi2, k=10000)),
    ('clf', OneVsRestClassifier(SGDClassifier(loss='log', penalty='elasticnet', alpha=0.0001, n_iter=10))),
])
Run Code Online (Sandbox Code Playgroud)

现在我的问题:我正在使用SelectKBest将模型大小限制到合理的数量,但对于子分类器,有时没有足够的输入数据可用,所以我甚至没有达到10k功能限制,这会导致

(...)
  File "/usr/local/lib/python3.4/dist-packages/sklearn/feature_selection/univariate_selection.py", line 300, in fit
    self._check_params(X, y)
  File "/usr/local/lib/python3.4/dist-packages/sklearn/feature_selection/univariate_selection.py", line 405, in _check_params
    % self.k)
ValueError: k should be >=0, <= n_features; got 10000.Use k='all' to return all features.
Run Code Online (Sandbox Code Playgroud)

我不知道在没有应用的情况下我将拥有多少功能CountVectorizer,但我必须提前定义管道.我的首选解决方案是跳过这SelectKBest一步,如果k功能少于功能,但我不知道如何在不调用CountVectorizer两次的情况下实现此行为(一次提前,一次作为管道的一部分).

有什么想法吗?

python scikit-learn

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

使用asyncio并行化生成器

我的应用程序从慢速i/o源读取数据,进行一些处理,然后将其写入本地文件.我用这样的生成器实现了这个:

import time

def io_task(x):
    print("requesting data for input %s" % x)
    time.sleep(1)   # this simulates a blocking I/O task
    return 2*x

def producer(xs):
    for x in xs:
        yield io_task(x)

def consumer(xs):
    with open('output.txt', 'w') as fp:
        for x in xs:
            print("writing %s" % x)
            fp.write(str(x) + '\n')

data = [1,2,3,4,5]
consumer(producer(data))
Run Code Online (Sandbox Code Playgroud)

现在我想在asyncio的帮助下并行完成这项任务,但我似乎无法弄清楚如何.对我来说,主要的问题是通过生成器直接从生产者向消费者提供数据,同时让asyncio发出多个并行请求io_task(x).而且,整体async def@asyncio.coroutine事情让我感到困惑.

有人可以告诉我如何构建一个使用asyncio此示例代码的最小工作示例吗?

(注意:只是调用,缓冲结果然后将它们写入文件是不行的io_task().我需要一个可以超出主存的大数据集的解决方案,这就是为什么我一直在使用生成器然而,假设消费者总是比所有生产者总和更快,这是安全的.

python multithreading generator python-asyncio

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

最有效的字符串相似度度量函数

我正在寻找 Python 中字符串相似度度量函数的有效实现(或提供 Python 绑定的库)。

我想比较平均大小为 10kb 的字符串,我不能采取任何捷径,例如逐行比较,我需要比较整个内容。我并不在乎将使用什么确切的度量标准,只要结果合理且计算速度快即可。这是我迄今为止尝试过的:

  • difflib.SequenceMatcher来自标准库。ratio()给出了很好的结果,但对于 10kb 文本需要 >100 毫秒。quick_ratio()只需要一半的时间,但结果有时与真正的价值相差甚远。
  • python-Levenshtein: levenshtein 对于我的用例来说是一个可以接受的指标,但Levenshtein.ratio('foo', 'bar')并不比SequenceMatcher.

在我开始对 pypi 上提供测量字符串相似度函数的每个库进行基准测试之前,也许您可​​以指出我正确的方向?如果可能的话,我很想将单次比较的时间减少到不到 10 毫秒(在商品硬件上)。

python string python-3.x levenshtein-distance

3
推荐指数
1
解决办法
3125
查看次数

Python是否有条件NOT语句

我想过滤一个值列表.根据变量的状态,我想返回过滤器的正或负结果.例:

def foo(it, my_condition):
    return [s for s in it if (s.startswith("q") if my_condition else not s.startswith("q"))]

foo(["The", "quick", "brown", "fox"], my_condition=True)
Run Code Online (Sandbox Code Playgroud)

所以,my_condition=True我得到了["quick"],my_condition=False我得到了["The", "brown", "fox"].

我不喜欢的实现是这部分:(s.startswith("q") if filter else not s.startswith("q")).它包含重复的代码,并在一个简洁的列表理解中占用了大量空间.我真正想要的只是插入notif,根据不同的状态filter变量.

这有更漂亮/更干净的解决方案吗?如果可能的话,我想在这种情况下避免lambda表达式的计算开销.

python boolean-expression python-3.x

2
推荐指数
1
解决办法
71
查看次数