我想使用我在互联网上找到的以下命令集从 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) 我在 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) 我使用 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 列表或数组的最快方法是什么?上面的方法太慢了。
我正在 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,它将有助于澄清这些事情。谢谢你的帮助。
在 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) 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 位?我搜索了我能找到的所有资源,但没有找到答案。
我正在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中返回零。
所以我的问题是:
如何访问和解释RDX:RAX中返回的值?
为什么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,但这听起来像是周期太多。
我需要在 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 一样。
下面是一个代码块,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条指令都是寄存器到寄存器指令。
我有三个 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 读取 …