我猜每个人都知道:
Python比全局变量更有效地访问局部变量
好的,这是真的:
oldlist = [str(i) for i in range(500)]
oldlist1 = [i for i in range(500)]
%%timeit
newlist = []
for word in oldlist:
newlist.append(word.upper())
Run Code Online (Sandbox Code Playgroud)
10000循环,最佳3:每循环178μs
%%timeit
def func():
newlist = []
for word in oldlist:
newlist.append(word.upper())
return newlist
newlist = func()
Run Code Online (Sandbox Code Playgroud)
10000次循环,最佳3次:每次循环93.2μs
不幸的是,看起来它不是全球规则,而是特例:
%%timeit
newlist = []
for nr in oldlist1:
newlist.append(nr * nr)
Run Code Online (Sandbox Code Playgroud)
10000个循环,最佳3:每循环60.3μs
%%timeit
def func():
newlist = []
for nr in oldlist1:
newlist.append(nr * nr)
return newlist
newlist = func()
Run Code Online (Sandbox Code Playgroud)
10000个循环,最佳3:每循环60.5μs
如何解释这些测试?
我正在尝试解决使用 Rust 加载外国库的问题。
输入:
我有一个可执行文件rtest和一个 dylib libcpp2rs.dylib。该库通过 FFI 链接到可执行文件:
#[link(name="cpp2rs")]
extern { ... }
Run Code Online (Sandbox Code Playgroud)
我的build.rs文件(我传递了一个带libcpp2rs.dylib位置的额外参数):
pub fn main() {
println!("cargo:rustc-link-search=native=./cpplib/bin");
}
Run Code Online (Sandbox Code Playgroud)
还有我的Cargo.toml文件:
[package]
name = "rtest"
version = "0.1.0"
authors = ["astavonin"]
build = "build.rs"
rpath = true
[dependencies]
libc = "0.2.10"
Run Code Online (Sandbox Code Playgroud)
我使用cargo build命令进行编译。
输出:
otool向我显示库将通过以下方式加载RPATH:
> otool -L rtest
rtest:
@rpath/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
Run Code Online (Sandbox Code Playgroud)
但同时 …
我正在研究应该可以访问struct proc->p_pid字段的Kext .问题是结构只在XNU源中定义,所以我incomplete definition of type 'struct proc'在编译时遇到了错误.
从我的角度来看,将XNU标题包含到我自己的项目中是一个难闻的解决方案,但是另一种方法是什么?是复制并将结构粘贴到我自己的代码中吗?
我真的很困惑Python中的函数调用速度.第一和第二种情况,没有任何意外:
%timeit reduce(lambda res, x: res+x, range(1000))
Run Code Online (Sandbox Code Playgroud)
10000循环,最佳3:每循环150μs
def my_add(res, x):
return res + x
%timeit reduce(my_add, range(1000))
Run Code Online (Sandbox Code Playgroud)
10000循环,最佳3:每循环148μs
但第三种情况对我来说很奇怪:
from operator import add
%timeit reduce(add, range(1000))
Run Code Online (Sandbox Code Playgroud)
10000个循环,最佳3:每循环80.1μs
同时:
%timeit add(10, 100)
%timeit 10 + 100
10000000 loops, best of 3: 94.3 ns per loop
100000000 loops, best of 3: 14.7 ns per loop
Run Code Online (Sandbox Code Playgroud)
那么,为什么第三种情况会加速约50%呢?
我有struct AccessToken外部库的一部分,我自己使用该库.我想返回这种类型的值,但我没有看到为什么我的内部实现应该从外部可见的任何原因.类型别名看起来很棒.
type AccessToken oauth.AccessToken
Run Code Online (Sandbox Code Playgroud)
但是我在尝试下一步时遇到错误:
func Auth(key string, secret string) *AccessToken {
...
var token oauth.AccessToken = AuthorizeToken(...)
return AccessToken(*token)
}
Run Code Online (Sandbox Code Playgroud)
错误:
cannot use AccessToken(*accessToken) (type AccessToken) as type *AccessToken in return argument
Run Code Online (Sandbox Code Playgroud)
很明显,我可以通过恶魔复制结构字段.但有没有办法使用别名?