首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >优化: Python、Perl和C后缀树库

优化: Python、Perl和C后缀树库
EN

Stack Overflow用户
提问于 2012-07-20 20:42:25
回答 1查看 637关注 0票数 5

我有大约3,500个由单行字符串组成的文件。文件大小不同(从200 b到1mb)。我试图比较每个文件和另一个文件,并在两个文件之间找到一个长度为20个字符的公共子序列。请注意,在每次比较期间,子序列仅在两个文件之间是常见的,而不是在所有文件中都很常见。

我对这个问题有些困惑,因为我不是专家,所以我得到了一个临时的解决方案。我使用itertools.combinations在Python中构建了一个列表,最终得到了大约6,239,278个组合。然后,我将文件一次两个传递给一个Perl脚本,该脚本充当一个后缀树库的包装器,用C编写,名为利布斯特树。我试图避免这种类型的解决方案,但是Python中唯一类似的C后缀树包装器受到了内存泄漏的影响。

所以这是我的问题。我对它进行了计时,在我的机器上,解决方案在25秒内处理了大约500次比较。因此,这意味着,它将需要大约3天的连续处理,以完成任务。然后,我必须再做一次,看看25个字符,而不是20个字符。请注意,我已经走出了我的舒适区域,不是一个很好的程序员,所以我肯定有一个更优雅的方法来做到这一点。我想我应该在这里请求它,并生成我的代码,看看是否有人对我如何更快地完成这项任务有任何建议。

Python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from itertools import combinations
import glob, subprocess

glist = glob.glob("Data/*.g")
i = 0

for a,b in combinations(glist, 2):
    i += 1
    p = subprocess.Popen(["perl", "suffix_tree.pl", a, b, "20"], shell=False, stdout=subprocess.PIPE)
    p = p.stdout.read()
    a = a.split("/")
    b = b.split("/")
    a = a[1].split(".")
    b = b[1].split(".")
    print str(i) + ":" + str(a[0]) + " --- " + str(b[0])
    if p != "" and len(p) == 20:
        with open("tmp.list", "a") as openf:
            openf.write(a[0] + " " + b[0] + "\n")

Perl代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use strict;
use Tree::Suffix;

open FILE, "<$ARGV[0]";
my $a = do { local $/; <FILE> };

open FILE, "<$ARGV[1]";
my $b = do { local $/; <FILE> };

my @g = ($a,$b);

my $st  = Tree::Suffix->new(@g);
my ($c) = $st->lcs($ARGV[2],-1);

print "$c";
EN

回答 1

Stack Overflow用户

发布于 2012-07-21 08:42:34

与编写Python来调用Perl调用C不同,我相信您最好放弃Python代码,用Perl编写全部代码。

如果您的文件肯定只包含一行,那么只需编写以下内容,就可以更简单地读取这两对文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my @g = <>;

我相信下面的程序执行与Python和Perl代码合并后的相同功能,但我无法测试它,因为我目前无法安装libstree。

但是,正如ikegami所指出的那样,为每一对文件计算和存储最长的公共子序列,然后将它们放入类别会好得多。我不会继续对此进行编码,因为我不知道您需要什么信息--是否只是子序列长度,或者是否需要字符和/或子序列的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use strict;
use warnings;

use Math::Combinatorics;
use Tree::Suffix;

my @glist = glob "Data/*.g";
my $iterator = Math::Combinatorics->new(count => 2, data => \@glist);

open my $fh, '>', 'tmp.list' or die $!;

my $n = 0;
while (my @pair = $iterator->next_combination) {
  $n++;
  @ARGV = @pair;
  my @g = <>;
  my $tree  = Tree::Suffix->new(@g);
  my $lcs = $tree->lcs;
  @pair = map m|/(.+?)\.|, @pair;
  print "$n: $pair[0] --- $pair[1]\n";
  print $fh, "@pair\n" if $lcs and length $lcs >= 20;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11589525

复制
相关文章
android一个弹出菜单的动画(二)「建议收藏」
代码:http://download.csdn.net/detail/baidu_nod/7731115
全栈程序员站长
2022/07/08
5200
android一个弹出菜单的动画(二)「建议收藏」
jquery导航菜单「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159432.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
5.8K0
jquery导航菜单「建议收藏」
Android学习之菜单
android中包含多种菜单,本例带来的是选项菜单和上下文菜单。 1.选项菜单 在android中,开发者可以在xml文档中部署所要添加的菜单,在后台调用即可。 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id="@+id/action_add" 5 android:title="添加" 6 android
水击三千
2018/02/27
9420
Android-SubMenu选项菜单和子菜单
简介: SubMenu:代表一个子菜单,包含1~N个MenuItem 实现效果: 具体实现方法: 主活动 MainActivity: public class MainActivity extends AppCompatActivity { //定义 “字体大小” 菜单项的标识 final int FONT_10 = 0x111; final int FONT_12 = 0x112; final int FONT_14 = 0x113; final int FON
圆号本昊
2021/09/24
1.3K0
Android-SubMenu选项菜单和子菜单
Android-菜单关联activity
有时,程序需要单击某个个菜单来实现启动ing其他的activity(或者service)
圆号本昊
2021/09/24
6230
Android-菜单关联activity
Android 侧滑抽屉菜单
  滑动菜单相信都不会陌生,你可能见过很多这样的文章,但我的文章会给你不一样的阅读和操作体验。
晨曦_LLW
2021/03/23
4K0
Android 侧滑抽屉菜单
Android菜单 布局 表格布局
多用于静态菜单页面 xml代码 代码内带详细解释 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="h
圆号本昊
2021/09/24
1.6K0
Android菜单 布局 表格布局
菜单权限表sql语句「建议收藏」
select m.* from t_menu m where m.state = ‘1’ and ((menu_type = 1 and exists (select 1 from v_user_menu b where m.menu_id = b.menu_id and b.sys_id = ‘3000’)) or (m.menu_type = 0 and exists (select 1 from v_user_menu b where m.menu_id = b.parent_id and b.sys_id = ‘3000’))) start with m.parent_id = ‘0’ connect by prior m.menu_id = m.parent_id order siblings by menu_order
全栈程序员站长
2022/11/16
6570
android 多条件筛选菜单效果
http://blog.csdn.net/u011733020/article/details/51002746
bear_fish
2018/09/20
3.5K0
android 多条件筛选菜单效果
Android仿qq侧滑菜单
我们经常能看到各种app中都有应用侧滑菜单(SlidingMenu),效果很好的一种显示方式,今天我就向大家展示可以说是很简单就能实现和qq的侧滑菜单很相似的效果。现在侧滑菜单的框架在github上也有很多,有兴趣的可以去搜一下,今天我就给大家展示一个简单的仿qq侧滑菜单的例子。
earthchen
2020/09/24
1.2K0
android下拉五级菜单联动
本人是一个不擅长Android的开发的,但是这几天在做联通的一个服务器配件管理系统,做完B/S的又要写C/S的,老板要求没办法。在做的过程中遇到了一个下拉菜单联动的问题,以前没做过,突然做还真有点不知所措了,在网上找了一大堆发现数据都是本地的应该构造好了,没卵用,不过也给了我很多想发,一开始想到用树去解决,可是每个树的节点个数不知道,要是动态创建就会很麻烦。最后在自己的努力下来构造JSON数据格式,其实弄明白感觉很简单,就是并保存你的上一级是谁,你的下一级是谁就可以了,但是数据库做的表没有结构可言很难构造出来有用的数据结构。
张泽旭
2018/12/10
2.5K0
android下拉五级菜单联动
css实现导航菜单下拉效果「建议收藏」
效果如下图,现在什么样式也没有,我们需要对HTML进行一些样式上的调整让其看起来好看一下。
全栈程序员站长
2022/09/19
2.8K0
css实现导航菜单下拉效果「建议收藏」
仿path菜单button的实现「建议收藏」
path刚出来时。其菜单button也算是让大多数人感到了惊艳,如今看来事实上是非常easy的就是动画的结合。
全栈程序员站长
2022/07/10
4570
仿path菜单button的实现「建议收藏」
点击加载更多

相似问题

芹菜-如何使用多个队列?

12

芹菜守护进程的多个队列

17

在芹菜中,使用多个队列是否对性能有重大影响?

10

Django芹菜多个工作进程和多个队列

10

在芹菜中排列多个队列的优先顺序?

38
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文