我有相当多的 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) 假设我有一个类似的数组:
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循环?
是否有一个纯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中.
我通过指定 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?
我有一个项目组织如下:
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 模块,仅用于我的单元测试?