小编RTC*_*222的帖子

ModuleNotFoundError:安装 deadsnakes 存储库时没有名为“apt_pkg”的模块

我想使用我在互联网上找到的以下命令集从 deadsnakes 存储库在 Ubuntu 18.04 上安装 Python 3.10(我目前使用的是 Python 3.8):

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.10
Run Code Online (Sandbox Code Playgroud)

但我得到了错误sudo: add-apt-repository: command not found

更多的网络研究使我在“ModuleNotFoundError:没有名为'apt_pkg'的模块”出现在各种命令中找到了这组命令 - Ask Ubuntu

sudo apt remove python3-apt
sudo apt autoremove
sudo apt autoclean
sudo apt install python3-apt
Run Code Online (Sandbox Code Playgroud)

其他网络资源也说了同样的事情,所以我这样做了,但是当我运行时仍然收到错误消息sudo add-apt-repository ppa:deadsnakes/ppa

然后我找到了如何修复 Ubuntu 和 Debian 上的“add-apt-repository 命令未找到” - phoenixNAP,它建议了这组命令:

sudo apt update
sudo apt install software-properties-common
sudo apt update
Run Code Online (Sandbox Code Playgroud)

所以我这样做了,但是当我运行时,sudo add-apt-repository ppa:deadsnakes/ppa我现在收到此错误消息:

~$ sudo add-apt-repository …
Run Code Online (Sandbox Code Playgroud)

python linux ubuntu apt

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

如何在 Ubuntu 18.04 上为 Postgres 启用 php pdo 驱动程序

我在 Ubuntu 18.04 上安装了 php 7.2 和 php 7.3,并创建了一个 php 文件来登录并将数据插入 Postgres 数据库。我的脚本响应“找不到驱动程序”。

研究表明我必须编辑 php.ini 文件并启用 Postgres 和 PDO 的扩展。下面是 php.ini 文件中的所有 extension= 行。我能找到的最接近的是下面显示的 pdo 线。

extension=pdo_pgsql
extension=pgsql
Run Code Online (Sandbox Code Playgroud)

所以我编辑了 php.ini 文件并从每一行中删除了分号以启用它们。然后我重新启动了Apache2:

sudo systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)

但我仍然得到“找不到驱动程序”。

这是来自 php.ini 文件的完整扩展列表。我需要启用哪些其他扩展才能允许 PDO 访问 Postgres?

php.ini 7.3

;extension=bz2
;extension=curl
;extension=fileinfo
;extension=gd2
;extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=interbase
;extension=ldap
;extension=mbstring
;extension=exif      ; Must be after mbstring as it depends on it
;extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
;extension=pdo_mysql …
Run Code Online (Sandbox Code Playgroud)

php pdo

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

Ctypes:将返回指针转换为数组或 Python 列表的快速方法

我使用 ctypes 将数组指针传递给 dll,并返回指向在 dll 中使用 malloc 创建的双精度数组的指针。返回到 Python 后,我需要一种快速方法将指针转换为数组或 Python 列表。

我可以使用此列表比较,但速度很慢,因为有 320,000 个数据点:

list_of_results = [ret_ptr[i] for i in range(320000)]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会在Python中创建数组并将其传递给dll,但我必须在dll中使用malloc创建它,因为这是一个动态数组,我事先不知道会有多少数据元素(尽管返回指针还返回数据元素的数量,因此我知道返回到 Python 时有多少个)——我使用 realloc 在 dll 中动态扩展数组大小;我可以将 realloc 与 Python 数组一起使用,但最后对 free() 的调用不能保证有效。

Here is the relevant Python code:

CallTest = hDLL.Main_Entry_fn
CallTest.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.c_int64]
CallTest.restype = ctypes.POINTER(ctypes.c_double)
ret_ptr = CallTest(DataArray, number_of_data_points)
list_of_results = [ret_ptr[i] for i in range(320000)]
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:将从 dll 返回的指针转换为 Python 列表或数组的最快方法是什么?上面的方法太慢了。

python arrays ctypes

6
推荐指数
1
解决办法
5530
查看次数

从源代码构建 Python 时,./configure 使用哪些标志

我正在 Ubuntu 18.04 上从源代码构建 Python 3.10,遵循多个 Web 链接的说明,主要是 Python 网站 ( https://devguide.python.org/setup ) 和 RealPython ( https://realpython.com/installing-python/ #如何从源代码构建 python)。我将 Python-3.10.0.tgz 提取到/opt/Python3.10. 我有三个问题。

首先,Python 网站说要使用./configure --with-pydebug,而 RealPython 说要使用./configure --enable-optimizations --with-ensurepip=install. 另一位消息人士称要包括--enable-shared--enable-unicode=ucs4。其中哪一个最好?我应该使用所有这些标志吗?

其次,我目前安装了Python 3.6和Python 3.8。它们安装在/usr. 按照我在网上看到的指示,我正在 /opt/Python3.10 中构建。我假设make altinstall(最后的构建步骤)将负责将构建安装在 下的常用文件夹中/usr,但这还不清楚。./configure --prefix=directory尽管没有任何网络资源提到这样做,但我应该使用吗?

--enable-optimizations最后,安装过程会减慢多少?

这是我第一次从源代码构建 Python,它将有助于澄清这些事情。谢谢你的帮助。

python python-3.x

6
推荐指数
1
解决办法
1232
查看次数

如何在64位NASM中使用malloc和free?

在 64 位 NASM 中,我使用 C 库中的 malloc() 分配 8000 字节的内存块,当我完成分配时,我通过调用 free() 来释放它。

我的研究提出了很多关于如何在 64 位 NASM 中执行此操作的相互矛盾的信息,并且许多信息是 32 位的,其中调用约定不同,或者是 C 或 C++,而不是 NASM。

我认为我的 malloc 部分是正确的,但我不确定 free 部分。我发布这个问题是因为我不想测试它并分配但未释放内存块。

所以我的两个问题很简单:
(1) 我是否有权利使用 64 位 NASM?
(2) Windows 和 Linux 的语法相同吗?

我仅显示程序的 malloc 和 free 部分:

extern malloc
extern free

push rdi

; Allocate the memory buffer
mov rdi,8000
call malloc
mov [array_pointer],rax ;array_pointer is initialized in .data

; Code that uses the buffer goes here.  

; Free the memory buffer …
Run Code Online (Sandbox Code Playgroud)

malloc free assembly x86-64 nasm

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

英特尔 AVX-512:如何设置 EVEX.z 位

EVEX.z 位在 AVX-512 中与 k 寄存器结合使用以控制屏蔽。如果 z 位为 0,则为合并屏蔽,如果 z 位为 1,则 k 寄存器中的零元素在输出中为零。

语法如下所示:

VPSUBQ zmm0{k2}{z},zmm1,zmm2
Run Code Online (Sandbox Code Playgroud)

其中 {z} 代表 z 位。

但是如何设置或测试 EVEX.z 位?我搜索了我能找到的所有资源,但没有找到答案。

x86 assembly machine-code avx512

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

NASM中的RDTSCP始终返回相同的值

我正在NASM中使用RDTSC和RDTSCP测量各种汇编语言指令的机器周期,以帮助优化。

我读了Intel的Gabriele Paoloni撰写的“如何在Intel IA-32和IA-64指令集体系结构上对代码执行时间进行基准测试”(2010年9月)和其他Web资源(其中大多数是C语言中的示例)。

使用下面的代码(从C转换),我测试了各种指令,但RDTSCP在RDX中始终返回零,在RAX中始终返回7。我首先认为7是周期数,但显然并非所有指令都需要7个周期。

rdtsc
cpuid
addsd xmm14,xmm1 ; Instruction to time
rdtscp
cpuid
Run Code Online (Sandbox Code Playgroud)

返回7,这并不奇怪,因为在某些体系结构上,添加了7个周期(包括延迟)。前两个指令(根据某些情况)可以颠倒,先是cpuid,然后是rdtsc,但这在这里没有什么区别。

当我将指令更改为2周期指令时:

rdtsc
cpuid
add rcx,rdx ; Instruction to time
rdtscp
cpuid
Run Code Online (Sandbox Code Playgroud)

这还会在rax中返回7,在rdx中返回零。

所以我的问题是:

  1. 如何访问和解释RDX:RAX中返回的值?

  2. 为什么RDX总是返回零,应该返回什么?

更新:

如果我将代码更改为此:

cpuid
rdtsc
mov [start_time],rax
addsd xmm14,xmm1 ; INSTRUCTION
rdtscp
mov [end_time],rax
cpuid
mov rax,[end_time]
mov rdx,[start_time]
sub rax,rdx
Run Code Online (Sandbox Code Playgroud)

我的rax达到了64,但这听起来像是周期太多。

optimization x86-64 nasm rdtsc windows64

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

用 Python 读取大型二进制文件的最快方法

我需要在 Python 3.6 中读取一个简单但大(500MB)的二进制文件。该文件是由 C 程序创建的,它包含 64 位双精度数据。我尝试使用 struct.unpack 但这对于大文件来说非常慢。

这是我读取的简单文件:

def ReadBinary():

    fileName = 'C:\\File_Data\\LargeDataFile.bin'

    with open(fileName, mode='rb') as file:
        fileContent = file.read()
Run Code Online (Sandbox Code Playgroud)

现在我有文件内容。将其解码为 64 位双精度浮点或无需进行格式转换即可读取的最快方法是什么?

如果可能,我想避免分块读取文件。我想一口气读完它,就像 C 一样。

python python-3.x

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

Perf 显示没有内存访问的块中的 L1-dcache-load-misses

下面是一个代码块,perf record 标记为造成所有 L1-dcache 未命中的 10%,但该块完全是 zmm 寄存器之间的移动。这是 perf 命令字符串:

perf record -e L1-dcache-load-misses -c 10000 -a -- ./Program_to_Test.exe
Run Code Online (Sandbox Code Playgroud)

代码块:

Round:
vmulpd zmm1,zmm0,zmm28
VCVTTPD2QQ zmm0{k7},zmm1
VCVTUQQ2PD zmm2{k7},zmm0
vsubpd zmm3,zmm1,zmm2
vmulpd zmm4,zmm3,zmm27
VCVTTPD2QQ zmm5{k7}{z},zmm4

VPCMPGTQ k2,zmm5,zmm26
VPCMPEQQ k3 {k7},zmm5,zmm26
KADDQ k1,k2,k3

VCVTQQ2PD zmm2{k7},zmm0
VDIVPD zmm1{k7},zmm2,zmm28 ; Divide by 100
VPXORQ zmm2{k7},zmm2,zmm2
vmovupd zmm2,zmm1
VADDPD zmm2{k1},zmm1,zmm25
Run Code Online (Sandbox Code Playgroud)

对于该代码块,我使用其他 L1 度量(例如 l1d.replacement)得到了类似的结果。

我的问题是,一个仅是 zmm 寄存器移动的块如何会产生 L1 缓存未命中?我认为寄存器根本不会进入内存。事实上,最后一次内存访问是在该代码块之上的10条指令;其他9条指令都是寄存器到寄存器指令。

linux performance profiling x86-64 perf

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

是否有更好的 AVX 指令从 3 个 ymm 寄存器移动数据?

我有三个 ymm 寄存器——ymm4、ymm5 和 ymm6——用双精度(qword)浮点数打包:

ymm4:   73  144 168 41
ymm5:   144 348 26  144
ymm6:   732 83  144 852
Run Code Online (Sandbox Code Playgroud)

我想写上面矩阵的每一列。例如:

-- extract ymm4[63:0] and insert it at ymm0[63:0]
-- extract ymm5[63:0] and insert it at ymm0[127:64]
-- extract ymm6[63:0] and insert it at ymm0[191:128]
Run Code Online (Sandbox Code Playgroud)

以便 ymm0 读取 73、144、732。

到目前为止,我使用过:

mov rax,4
kmovq k6,rax
vpxor ymm1,ymm1
VEXPANDPD ymm1{k6}{z},ymm6
Run Code Online (Sandbox Code Playgroud)

这会导致 ymm1 读取 [0 0 732],所以我已经完成了第一步,因为 732 是 ymm6 中 [63:0] 处的元素。

对于 ymm4 和 ymm5,我使用 vblendpd:

vblendpd ymm0,ymm1,ymm4,1
Run Code Online (Sandbox Code Playgroud)

这会导致 ymm0 读取 …

assembly x86-64 nasm avx avx2

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