小编Kat*_*tie的帖子

Python heapq 与预排序列表的排序速度

我有相当多的 n=10000 个长度为 k=100 的排序列表。由于合并两个排序列表需要线性时间,我认为heapq.merge()在深度 log(n) 树中递归合并长度为 O(nk) 的排序列表比sorted()在 O(nklog( n) 中对整个事物进行一次排序更便宜nk)) 时间。

但是,该sorted()方法在我的机器上似乎快了 17-44 倍。它的实现是否sorted()heapq.merge()经典合并的渐近时间优势快得多?

import itertools
import heapq

data = [range(n*8000,n*8000+10000,100) for n in range(10000)]

# Approach 1
for val in heapq.merge(*data):
    test = val

# Approach 2
for val in sorted(itertools.chain(*data)):
    test = val
Run Code Online (Sandbox Code Playgroud)

python sorting merge list

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

在1 I/O传递中以numpy提取和的字典的最快方法

假设我有一个类似的数组:

arr = np.array([[1,20,5],
                [1,20,8],
                [3,10,4],
                [2,30,6],
                [3,10,5]])
Run Code Online (Sandbox Code Playgroud)

我想形成一个字典,列出第一列的总和,每行匹配第一列中的每个值,即返回{1: 13, 2: 6, 3: 9}.为了使事情更具挑战性,我的数组中有10亿行,第一列中有10万个独特元素.

方法1:天真地,我可以调用np.unique()然后迭代遍历唯一数组中的每个项目,np.where()np.sum()在一个单行字典中包含列表理解.如果我有少量独特的元素,这将是相当快的,但在100k独特的元素,我将招致大量浪费的页面提取,使整个阵列的100k I/O传递.

方法2:我可以对最后一列进行单个I/O传递(因为必须在每一行中散列第1列可能比过多的页面提取更便宜),但是我在这里失去了numpy的C内循环向量化的优势.

有没有一种快速的方法来实现方法2而不诉诸纯Python循环?

python dictionary numpy vectorization pandas

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

如何用另一个默认图标替换Bootstrap下拉切换图标?

是否有一个纯CSS方法来替换Bootstrap dropdown-toggle类中的插入符号图标?我希望它看起来像向下箭头或逻辑或符号(∨),如下所示:

带箭头的下拉菜单

而不是原来的向下实心三角形插入符号.我找到了替换原始图标大小的答案:

.dropdown-toggle::after {
    display: inline-block; /* Default */
    width: 0; /* Default */
    height: 0; /* Default */
    margin-left: .3em; /* Default */
    vertical-align: middle; /* Default */
    content: ""; /* Default */
    border-top: .3em solid; /* caret size */
    border-right: .3em solid transparent; /* caret size */
    border-left: .3em solid transparent; /* caret size */
}
Run Code Online (Sandbox Code Playgroud)

但我无法想出一个让它成为箭头的好方法.此处引用的另一个问题要求您手动将图像嵌入HTML中.

html css html5 css3 bootstrap-4

6
推荐指数
2
解决办法
1445
查看次数

将 clang 与 Cython 结合使用

我通过指定 CC 环境变量强制 Cython 使用 clang:

import os
os.environ['CC'] = 'clang'
Run Code Online (Sandbox Code Playgroud)

我有一个标准构建:

EXT_MODULES = [Extension('example.src.ex',
                         sources=['example/src/ex.pyx'])]

setup_info = dist(
    ...
    ext_modules=cythonize(EXT_MODULES,
                          compiler_directives={'language_level': '3'}),
    ...
)
setup(**setup_info)
Run Code Online (Sandbox Code Playgroud)

然而,Cython 似乎在构建步骤的不同部分中同时使用了clang和 gcc,特别是它使用 gcc 来构建共​​享库:

running build_ext
building 'example.src.ex' extension
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/example
creating build/temp.linux-x86_64-3.8/example/src
clang -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/local/include/python3.8 -c example/src/ex.c -o build/temp.linux-x86_64-3.8/example/src/ex.o
creating build/lib.linux-x86_64-3.8
creating build/lib.linux-x86_64-3.8/example
creating build/lib.linux-x86_64-3.8/example/src
gcc -shared -Wl,--strip-all build/temp.linux-x86_64-3.8/example/src/ex.o -L/usr/local/lib -o build/lib.linux-x86_64-3.8/example/src/ex.cpython-38-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)

如何让 Cython 在这两个步骤上使用 clang?

python clang cython python-3.x cythonize

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

使用 cython 运行 pytest - 如何在 pytest 中编译 cython 模块?

我有一个项目组织如下:

project
??? project
?   ??? module1
?   ?   ??? api.py
?   ?   ??? _cpython_foo.py
?   ?   ??? _cython_foo.pyx
?   ??? module2
??? setup.py
??? tests
    ??? module1
        ??? test_cython_foo.py
        ??? test_cpython_foo.py
Run Code Online (Sandbox Code Playgroud)

其中api.py进口cythonized扩展:

 """api.py""""
 from _cython_foo import cython_fun
Run Code Online (Sandbox Code Playgroud)

我的安装脚本.pyx正确地构建了源代码,我可以cython_fun在已安装的包中使用:

import project.module1.api as module1
module1.cython_fun()    # OK
Run Code Online (Sandbox Code Playgroud)

但是,pytest抱怨它无法导入 cython 模块,因为在我调用 setup.js 之前编译的二进制文件没有到位。

project/module1/api.py:2: in <module>
    from _cython_foo import cython_fun
E   ImportError: No module named _cython_foo
Run Code Online (Sandbox Code Playgroud)

在 pytest 所依赖的项目目录中留下一堆预编译的二进制文件似乎是一种糟糕的风格,那么是否有一种传统的方法可以让 pytest 临时构建 cython 模块,仅用于我的单元测试?

python testing cython pytest

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