我一直在玩pyglet.这是很不错的.但是,如果我运行我的代码,这是一个可执行文件(称为game.py),前缀是通常的
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
通过做
./game.py
Run Code Online (Sandbox Code Playgroud)
然后它有点笨重.但是,如果我运行它
python -O ./game.py
Run Code Online (Sandbox Code Playgroud)
要么
PYTHONOPTIMIZE=1 ./game.py
Run Code Online (Sandbox Code Playgroud)
那么它的超顺畅.
我不在乎为什么它在没有优化的情况下运行缓慢; pyglet的文档提到优化禁用了大量的断言以及OpenGL的错误检查,我很高兴将其留在那里.
我的问题是:人们如何分发Python代码以确保最终用户(对调试或修改代码没有兴趣)运行优化版本的代码.当然有一些更好的方法,而不仅仅是告诉人们确保他们在发行说明中使用优化(他们可能无论如何都不会阅读)?
在Linux上,我可以轻松地./game
为最终用户提供运行该文件的脚本:
#!/bin/sh
PYTHONOPTIMIZE=1 ./game.py $*
Run Code Online (Sandbox Code Playgroud)
但这不是非常跨平台的.
我有一个想法,我应该能够改变#!
线路
#!/usr/bin/env PYTHONOPTIMIZE=1 python
Run Code Online (Sandbox Code Playgroud)
要么
#!/usr/bin/env python -O
Run Code Online (Sandbox Code Playgroud)
但那些似乎没有按预期工作,我不确定他们在Windows上做了什么.
有没有办法从我不知道的代码中控制优化?就像是:
import runtime
runtime.optimize(True)
Run Code Online (Sandbox Code Playgroud)
运送多平台python代码的人在这个领域被认为是最佳实践?
我正在玩scala的分布式演员.非常好.
我有一个执行传入函数对象的服务器.例如,客户端有
object Tasks {
def foo = {Console.println("I am Foo")};
def bar = {Console.println("I am Bar");}
}
// In client actor...
...
server ! Tasks.foo _
...
Run Code Online (Sandbox Code Playgroud)
服务器可以选择这些并使用actor代码执行它们
react {
case task:(()=>Unit) =>
task()
Run Code Online (Sandbox Code Playgroud)
这一切都运行得很好(确实非常非常酷)但我scalac
对服务器代码输出的警告消息感到困惑:
warning: non variable type-argument Unit in type pattern is unchecked since it is eliminated by erasure
case task:(()=>Unit) =>
^
Run Code Online (Sandbox Code Playgroud)
我该如何清除此警告?
(我上的区别不太清楚Unit
类型,以及()=>Unit
零参数的函数类型.只是想匹配task:Unit
的react
是警告,免费的,但实际上是不匹配传入的任务.)
使用Sun的Java6在Debian上使用Scala 2.7.5.
Project Euler问题中一个并不罕见的模式似乎相当于:
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)
Run Code Online (Sandbox Code Playgroud)
其中f是一些昂贵的计算函数,它将正值返回到某个未知点,然后返回零.
我喜欢并行化的东西,特别是当Scala的并行集合并且.par
让它变得如此简单时.但是在没有ParStream的情况下,我提出的最好的是:
val BATCH=1024
Stream.from(1,BATCH).flatMap(
i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)
Run Code Online (Sandbox Code Playgroud)
它看起来不是很优雅,而且对BATCH
价值的选择很敏感(但是我的四核可以提高x4的速度).
有关更清洁的方法获得相同结果的任何建议吗?
我发现自己创造了一堂课
template <typename T> struct invoker {
void operator()(T& it) const {it();}
};
Run Code Online (Sandbox Code Playgroud)
所以我可以传递一个invoker<foo>
到要调用的东西(这是不是我的控制之下),invoker<foo>::operator()(foo&)
就可以反复用不同的foo
情况下,得到它的呼叫转发到foo
的foo::operator()()
方法.
我知道它只有几行,但这似乎是STL的功能或boost::bind
某种方式已经提供的那种东西.除非我看不到诀窍,如果有的话.(我确定我不是第一个使用非常类似的东西的人;它有名字吗?)
如果我用scipy.linalg.solve
(我相信调用LAPACK的gesv功能)上〜12000未知的问题(有〜12000平方米,致密,非对称矩阵)我的工作站上,我得到了一个很好的答案10-15分钟.
只是为了探究可能的极限(注意我并没有说"有用"),我将基础问题的分辨率加倍,这导致需要解决约50000个未知数.虽然有一次,我添加交换的GB的一些10S这在技术上我的工作站上运行,它似乎更谨慎地使用一些硬件有足够的RAM,所以我踢它关闭上的AWS EC2高内存四超大. ..在过去的14个小时里它一直在磨砺(嘿,现场实例很便宜)而且它无法分辨它到底有多远.
不幸的是,我不知道所涉及的解算器的时间复杂性是什么(我的google-fu在这个问题上失败了).如果它是O(N ^ 2)那么我预计它将在大约4小时后完成; 如果它是O(N ^ 3)那么它可能会在16小时内完成.当然,这将N解释为未知数 - 已经翻了四倍 - 矩阵中的元素数量增加了16倍!
并且建议将帮助我确定这是否有可能在我(项目)的生命中完成或不感激地收到!
其他信息:
稀疏矩阵在这里并不重要(我的矩阵是密集的,并且在任何情况下,2**31
即使在64位上,scipy也不能用于非零元素).
我在工作站上使用Debian/Squeeze的scipy,在EC2上使用Ubuntu 12.04.两者都显然是64位.
我在看AVX编程参考.在新的Haswell指令包括一些期待已久的"聚集"的负荷.但是,我无法弄清楚索引数据项的对齐限制.第2.5节"内存对齐"的引用似乎应该列出VGATHER*
表2.4或2.5 中的各种指令......但事实并非如此.
背景:虽然收集指令支持的数据大小为4和8字节,但我的应用程序可以从将相邻的16位数据值集合加载到DWORDS中受益.具有2字节比例的奇数索引将产生2字节对齐的4字节加载,并且我从手册中不清楚这是否会出错或者无法按预期工作(我宁愿怀疑我运气不好)支持未对齐访问的指令似乎在其中有一个"U".
重要提示:在此处投入太多时间之前,请向下滚动到"最终更新".事实证明,主要的教训是要注意单元测试套件中其他测试的副作用,并在得出结论之前始终将事物单独复制!
从表面上看,以下64位代码使用VirtualAlloc(总共4GByte)分配(并访问)一兆的4k页面:
const size_t N=4; // Tests with this many Gigabytes
const size_t pagesize4k=4096;
const size_t npages=(N<<30)/pagesize4k;
BOOST_AUTO_TEST_CASE(test_VirtualAlloc) {
std::vector<void*> pages(npages,0);
for (size_t i=0;i<pages.size();++i) {
pages[i]=VirtualAlloc(0,pagesize4k,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
*reinterpret_cast<char*>(pages[i])=1;
}
// Check all allocs succeeded
BOOST_CHECK(std::find(pages.begin(),pages.end(),nullptr)==pages.end());
// Free what we allocated
bool trouble=false;
for (size_t i=0;i<pages.size();++i) {
const BOOL err=VirtualFree(pages[i],0,MEM_RELEASE);
if (err==0) trouble=true;
}
BOOST_CHECK(!trouble);
}
Run Code Online (Sandbox Code Playgroud)
但是,在执行它时会增加Windows任务管理器中报告的"工作集" (并通过"峰值工作集"列中的"粘贴"值确认)从基线~200,000K(~200MByte)到超过6,000,000或7,000,000K (在64位Windows7上测试,也在ESX虚拟化的64位Server 2003和Server 2008上测试;遗憾的是我没有注意到观察到的各种数字的系统).
另一个非常相似的测试案例在同一个单元测试可执行文件中测试了一个超级4k的mallocs(后面是frees),并且在运行时只能扩展到预期的4GByte.
我不明白:VirtualAlloc是否有一些相当高的每分配开销?如果是这样,它显然是页面大小的一小部分; 为什么需要这么多额外的东西以及它的用途是什么?或者我误解了"工作集"报道实际上意味着什么?这里发生了什么?
更新:参考Hans的回答,我注意到在第二页访问中出现访问冲突失败,所以无论发生什么都不如分配到64K"粒度"那么简单.
char*const ptr = reinterpret_cast<char*>(
VirtualAlloc(0, 4096, MEM_RESERVE | MEM_COMMIT, …
Run Code Online (Sandbox Code Playgroud) 我有一个Qt 4.8应用程序,它的前端UI都是通过QDeclarativeView中的QML完成的.
在应用程序的(原始)Linux版本上,它通过指定在文本项目的QML中使用了几种字体
font.family: "ReykjavikOne OT AGauge"
Run Code Online (Sandbox Code Playgroud)
要么
font.family: "ReykjavikOne OT CGauge"
Run Code Online (Sandbox Code Playgroud)
这些工作正如预期的那样(CGauge是一种肥胖,粗体版本).
但是,在Mac端口上,这两个似乎都回归到一些丑陋的默认后备sans字体.但是使用
font.family: "ReykjavikOne OT"
Run Code Online (Sandbox Code Playgroud)
得到"AGauge".
在Linux系统上,fc-list | grep ReykjavikOne
得到我
/usr/share/fonts/opentype/ReykjavikOneCGaugeItalic.otf: ReykjavikOne OT,ReykjavikOne OT CGaugeItalic:style=CGaugeItalic
/usr/share/fonts/opentype/ReykjavikOneCGauge.otf: ReykjavikOne OT,ReykjavikOne OT CGauge:style=CGauge
/usr/share/fonts/opentype/ReykjavikOneAGauge.otf: ReykjavikOne OT,ReykjavikOne OT AGauge:style=AGauge
/usr/share/fonts/opentype/ReykjavikOneAGaugeItalic.otf: ReykjavikOne OT,ReykjavikOne OT AGaugeItalic:style=AGaugeItalic
Run Code Online (Sandbox Code Playgroud)
在Mac上,FontBook在单个"ReykjavikOne OT"条目下显示列为子项目的4种样式.CGauge字体似乎在Mac上的其他应用程序中完全可用,所以我假设这是Qt/QML特有的问题.
似乎没有任何QML文本/字体机制(至少,我不能发现),我可以通过它选择样式名称为"CGauge"的字体样式.用粗体/字体重量搞乱似乎让我更加大胆的AGauge或默认字体.
QML RichText内容也大致相同.<style></style>
包含font-family: 'ReykjavikOne OT CGauge'
在Linux上工作正常的元素的文本,但在Mac上它恢复为后备字体并且'ReykjavikOne OT'
是最好的,可以获得AGauge.(添加一个font-weight: bold;
确实得到一个大胆的AGauge,但CGauge明显更胖).
Mac和Linux(Debian/Wheezy)系统都使用相同的.otf文件安装字体.
我最好的希望是解决这个问题,并按照预期在Mac上显示字体的CGauge样式?(注意我是字体和Mac的新手).
我发现scala'-i'命令行选项对于运行一些scala代码然后将我转储到交互式shell中非常有用,因此我可以生成/检查它定义的内容.
有一件事让我完全神秘:为什么它加载并运行脚本两次?
例如,给定文件test.scala包含cannonical
println("Hello world")
Run Code Online (Sandbox Code Playgroud)
赛跑
scala -i test.scala
Run Code Online (Sandbox Code Playgroud)
生产:
$ scala -i test.scala
Loading test.scala...
Hello world
Loading test.scala...
Hello world
Welcome to Scala version 2.7.5final (Java HotSpot(TM) Client VM, Java 1.6.0_12).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Run Code Online (Sandbox Code Playgroud)
显然运行两次并不是太令人头痛,但是对于运行需要一段时间的脚本来说很烦人(我正在使用[Project Euler]((https://projecteuler.net)问题来学习scala)
我假设我在某种程度上误解了-i选项的意图或用法......如何让我的脚本文件只运行一次?
(FWIW,我和Debian/Lenny一起使用Squeeze的scala包.)
scala ×3
c++ ×2
64-bit ×1
alignment ×1
amazon-ec2 ×1
avx ×1
boost-bind ×1
command-line ×1
debian ×1
fonts ×1
functor ×1
interactive ×1
lapack ×1
memory ×1
opentype ×1
optimization ×1
performance ×1
pyglet ×1
python ×1
qml ×1
qt ×1
scipy ×1
shell ×1
stl ×1
templates ×1
typography ×1
virtualalloc ×1
winapi ×1
x86 ×1