小编Juk*_*ela的帖子

Swift Beta性能:排序数组

我在Swift Beta中实现了一个算法,并注意到性能非常差.在深入挖掘之后,我意识到其中一个瓶颈就像排序数组一样简单.相关部分在这里:

let n = 1000000
var x =  [Int](repeating: 0, count: n)
for i in 0..<n {
    x[i] = random()
}
// start clock here
let y = sort(x)
// stop clock here
Run Code Online (Sandbox Code Playgroud)

在C++中,类似的操作在我的计算机上需要0.06秒.

在Python中,它需要0.6秒(没有技巧,只有y =排序(x)表示整数列表).

在Swift中,如果我使用以下命令编译它需要6秒:

xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx`
Run Code Online (Sandbox Code Playgroud)

如果我使用以下命令编译它需要多达88秒:

xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx`
Run Code Online (Sandbox Code Playgroud)

Xcode中使用"Release"与"Debug"构建的计时相似.

这有什么不对?与C++相比,我可以理解一些性能损失,但与纯Python相比,速度没有降低10倍.


编辑:天气注意到,改变-O3-Ofast使这个代码的运行几乎一样快如C++版本!但是,-Ofast更改了语言的语义 - 在我的测试中,它禁用了对整数溢出和数组索引溢出的检查.例如,使用-Ofast以下Swift代码以静默方式运行而不会崩溃(并打印出一些垃圾):

let …
Run Code Online (Sandbox Code Playgroud)

sorting performance compiler-optimization swift xcode6

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

所有分支都使用git bundle进行增量备份

使用git存储库进行增量备份的最简单方法是什么git bundle

如果我只想备份一个分支,我可以沿着这些方向做一些事情:

git bundle create foo last-backup..master
git tag -f last-backup master
Run Code Online (Sandbox Code Playgroud)

但是如果我想备份所有内容(包括所有分支)呢?


要回答评论中的问题:

严格地说,只要解决方案满足以下属性,我就不需要使用通常的Git包:

  • 每个增量备份都是一个文件.我可以将它存储在某个地方,后续的增量备份不需要修改此文件.

  • 文件大小约等于自上次备份以来Git提交的总大小.二进制文件的更改也可以有效地存储.

  • 从那时起,完整备份+所有增量备份包含自动重建存储库所需的所有内容,包括所有分支.

(作为一个简单的例子,简单地在git存储库中构建一个包含最近更改过的文件的tar存档,如果发生自动垃圾收集,则无法满足第二个要求.)

理想情况下,我还希望有一个防止白痴的系统:

  • 我几乎可以对我的Git存储库进行任何完整备份,以及所有最近的增量备份,我可以简单地"拉"备份中的所有内容,并且存储库将是最新的.特别是,完全备份和增量备份之间是否存在部分重叠并不重要.

如果我只需要处理一个分支,Git捆绑包就能很好地满足这一切.

git backup

21
推荐指数
2
解决办法
8947
查看次数

用于Python的快速max-flow min-cut库

是否有一个可靠且记录良好的Python库,可快速实现一种算法,可以在有向图中找到最大流量和最小切割量?

来自python-graph的pygraph.algorithms.minmax.maximum_flow解决了这个问题,但速度很慢:在一个有4000个节点和11000个边缘的有向图中查找最大流量和最小切割需要> 1分钟.我正在寻找至少快一个数量级的东西.

赏金:我在这个问题上提供了一笔赏金,看看自从提出这个问题以来情况是否发生了变化.如果您对自己推荐的图书馆有个人经验,可以获得奖励积分!

python graph-theory graph mathematical-optimization max-flow

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

快速列出大量文件的上次提交日期

我想列出git存储库中大量文件最后提交日期.

为了具体起见,让我们假设我想获取*.txt特定子目录中所有文件的最后提交日期.存储库中总共有数万个文件,相关*.txt文件的数量在数百个.存储库中已有数千个提交.

我尝试了三种不同的方法.


解答1. 这个问题给出了一个答案,基于git log.但是,如果我尝试做这样的事情,那就很慢了:

find . -name '*.txt' |
    xargs -n1 git log --format=format:%ai -n1 --all -- '{}'
Run Code Online (Sandbox Code Playgroud)

在我的测试案例中,花了几分钟 - 对我来说太慢了.


解决方案2.这样的事情快得多,不到一秒钟:

git log --format=format:%ai --name-only .
Run Code Online (Sandbox Code Playgroud)

但是,我必须编写一个后处理输出的脚本.此外,上面的命令打印出许多永远不需要的信息:无关文件和旧提交.


解决方案3.我也试过这样的东西,以摆脱不相关的文件:

git log --format=format:%ai --name-only `find . -name '*.txt'`
Run Code Online (Sandbox Code Playgroud)

然而,事实证明这比解决方案2 .(运行时间有3个不同.)此外,它仍然会打印不再需要的旧提交.


题.我错过了什么吗?有快速方便的方法吗?当我们提交更多数量的提交时,最好是现在还是将来工作的东西?

git

17
推荐指数
1
解决办法
2502
查看次数

Swift:如何在println之后刷新stdout?

如何在println命令后刷新Swift中的stdout ?

也就是说,什么是Swift相当于fflush(stdout)C?

swift

15
推荐指数
3
解决办法
3008
查看次数

Swift如何存储结构数组?

你可以向C程序员解释当你在Swift中沿着这些方向做某些事情时发生的事情:

struct X { var a: Int32; var b: Int32 }
class Y { var a: Int32; var b: Int32 }
var x1 = X[](count: 1000)
let x2 = X[](count: 1000)
var y1 = Y[](count: 1000)
let y2 = Y[](count: 1000)
Run Code Online (Sandbox Code Playgroud)

特别是,内存布局究竟是什么?从堆栈分配什么,从堆分配什么?我们在这里分配了多少个独立的内存块?

我的猜测是沿着这些方向发生的事情:

  • x1和x2是指向包含数组大小(1000)的连续内存块的指针,后跟2000个整数(存储x1 [0] .a,x1 [0] .b,x1 [1] .a,..按此顺序); 内存块是从堆中分配的.

  • y1和y2是指向包含数组大小(1000)的连续内存块的指针,后跟1000个指针(存储对象y1 [0],y1 [1],...)的引用; 这些中的每一个指向表示对象Y的实例的单独的存储块,并且这些存储块包含引用计数器+字段a和b; 每个对象Y都是从堆中单独分配的.

这是否与Apple目前实施的Swift实际发生的情况相近?

在生成的机器代码中,x1和x2的存储或访问方式有何不同?y1和y2之间怎么样?

swift

10
推荐指数
1
解决办法
3282
查看次数

matplotlib:更快的PDF生成?

我想用matplotlib生成一些PDF文件.我的主要问题是matplotlib很慢,每个文件的顺序为0.5秒.

我试图弄清楚为什么需要这么长时间,我编写了以下测试程序,它只是将一条非常简单的曲线绘制为PDF文件:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

X = range(10)
Y = [ x**2 for x in X ]

for n in range(100):
    fig = plt.figure(figsize=(6,6))
    ax = fig.add_subplot(111)
    ax.plot(X, Y)
    fig.savefig("test.pdf")
Run Code Online (Sandbox Code Playgroud)

但即使是这样简单的事情也需要花费大量时间:100个PDF文件共计15-20秒(现代英特尔平台,我尝试过Mac OS X和Linux系统).

有没有什么技巧和技巧可以用来加速matplotlib中的PDF生成?显然我可以在多核平台上使用多个并行线程,但还有什么我可以做的吗?

python pdf-generation matplotlib

8
推荐指数
1
解决办法
3983
查看次数

MPI实现(OpenMPI,MPICH)如何处理安全性/身份验证

当我通过TCP/IP套接字在进程之间发送MPI消息时,OpenMPI和MPICH如何处理安全性?

特别是,它们如何阻止同一网络的其他用户连接到侦听套接字并发送伪MPI消息?

具体方案如下:

  • 管理员是值得信赖的.不受信任的用户无法对任何硬件或网络进行物理访问.不受信任的用户没有root访问权限.
  • 但是,不受信任的用户可以在群集中运行自己的程序; 群集节点是典型的Linux机箱.特别是,不受信任的用户可以打开从任何计算机到群集中任何其他计算机的TCP连接,并发送任意消息.

security mpi openmpi mpich

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

python,matplotlib,svg和文本标签中的超链接

matplotlib中,可以创建带有超链接的SVG图形.

例如,我可以使用该scatter方法绘制标记,以便每个标记都是超链接.

但是,我的一些标记具有使用该text方法创建的文本标签.我可以以某种方式将文本标签转换为超链接吗?


到目前为止,我已经能够实现以下目标.首先,使用边界框创建文本标签,以便bbox字典具有url参数:

ax.text(x, y, label, bbox=dict(boxstyle=..., url=url))
Run Code Online (Sandbox Code Playgroud)

然后matplotlib/backends/backend_svg.py轻轻补丁(版本1.1.1),替换

self.writer.end('</a>')
Run Code Online (Sandbox Code Playgroud)

self.writer.end('a')
Run Code Online (Sandbox Code Playgroud)

现在几乎可以了.我可以点击文本周围的区域,但不能点击文本本身(否则,如果我在白色背景上有黑色文字,我可以点击白色部分的任何地方,但不能点击黑色部分).


将整个文本标签转换为超链接(文本及其边界框)的最简单方法是什么?

理想情况下,我更喜欢不需要修补matplotlib库的解决方案.

python svg matplotlib hyperlink

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

生成PDF文件,绘制带圆角的多边形

如果我想编写一个生成PDF格式矢量图形的Python脚本,那么该工作的正确工具是什么?特别是,我需要绘制带圆角的填充多边形(即由直线和圆弧组成的平面图形).

似乎matplotlib可以很容易地绘制具有圆角的矩形和具有尖角的一般多边形.但是,要绘制带圆角的多边形,我似乎必须首先计算出近似于形状的贝塞尔曲线.

有没有更直接的可用?或者是否有另一个库可用于计算Bézier曲线,该曲线近似于我想要生成的形状?理想情况下,我只需为每个顶点指定(位置,角半径)对.

这是一个例子:我想指定红色多边形(+每个角的半径),库将输出灰色图:

例

(对于凸多边形,我可以作弊并使用粗笔绘制多边形的轮廓.但是,这在非凸面情况下不起作用.)

python bezier pdf-generation vector-graphics polygons

5
推荐指数
2
解决办法
2548
查看次数