我有一些为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)
基本上,我必须解析整个事情并重建参数列表而不使用类型注释.我怎么会接近这个?
我有一个 Python 进程,在很长一段时间(至少 10 小时,有时更长)后开始泄漏内存。这个问题很难重现,因此我想在问题出现时附加到正在运行的Python解释器,并以某种方式检查内存使用情况,例如通过获取当前分配最多内存的对象列表。
对于通常的分析工具(如tracemalloc或内存分析器)来说,这是很困难的,因为它们需要成为代码的一部分或与进程一起启动,并且它们对运行时性能有重大影响。
我想要的是一个采样分析器,我可以简单地将其附加到现有的 Python 进程(如py-spy ),但 py-spy 只能让我了解函数中花费的 CPU 时间,而不是内存使用情况。
是否有其他工具或不同的方法可以帮助我深入了解现有 Python 进程的内存使用情况?
编辑:我刚刚找到了pyrasite,它提供了pyrasite-memory-viewer命令,这正是我正在寻找的,但不幸的是该项目似乎被放弃了,我无法让它在Python 3.8上工作。
我真的不知道如何描述我的问题,所以我只是展示一个代码示例:
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值.对于每个领域,我必须使用以下其中一个:
所以我试图构建一个方法,可以避免我写这个循环大约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) 我正在使用包含地理参考内容的 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 查询中手动提取此类数据的最佳方法是什么。
我正在尝试使用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两次的情况下实现此行为(一次提前,一次作为管道的一部分).
有什么想法吗?
我的应用程序从慢速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 中字符串相似度度量函数的有效实现(或提供 Python 绑定的库)。
我想比较平均大小为 10kb 的字符串,我不能采取任何捷径,例如逐行比较,我需要比较整个内容。我并不在乎将使用什么确切的度量标准,只要结果合理且计算速度快即可。这是我迄今为止尝试过的:
difflib.SequenceMatcher来自标准库。ratio()给出了很好的结果,但对于 10kb 文本需要 >100 毫秒。quick_ratio()只需要一半的时间,但结果有时与真正的价值相差甚远。python-Levenshtein: levenshtein 对于我的用例来说是一个可以接受的指标,但Levenshtein.ratio('foo', 'bar')并不比SequenceMatcher.在我开始对 pypi 上提供测量字符串相似度函数的每个库进行基准测试之前,也许您可以指出我正确的方向?如果可能的话,我很想将单次比较的时间减少到不到 10 毫秒(在商品硬件上)。
我想过滤一个值列表.根据变量的状态,我想返回过滤器的正或负结果.例:
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")).它包含重复的代码,并在一个简洁的列表理解中占用了大量空间.我真正想要的只是插入not后if,根据不同的状态filter变量.
这有更漂亮/更干净的解决方案吗?如果可能的话,我想在这种情况下避免lambda表达式的计算开销.
python ×5
python-3.x ×4
for-loop ×1
generator ×1
geospatial ×1
java ×1
memory-leaks ×1
profiling ×1
rdf ×1
scikit-learn ×1
sparql ×1
string ×1
type-hinting ×1