减少执行时间

时间:2014-04-02 10:09:02

标签: c# python powershell

我有一个excel文件以及一个config xml文件。这个配置xml文件包含excel文件中存在的一些键。我的目标是解析xml文件并找出这些键是否存在于excel文件中。我使用了2个循环来完成这个任务。这需要花费很多时间才能完成。下面给出了我的代码语法。

foreach(node in xmlfile)
{
    foreach(key in excelfile)
    {
        if(key.Equals(node))
        {
            print node +"found"
        }
    }
}

上述代码的问题在于搜索excel文件需要花费大量时间。我的excel文件太大了,除了xml文件之外还有很多键。

还有其他更好的方法来完成这项任务吗?

3 个答案:

答案 0 :(得分:1)

解决方案尽可能低效。那是因为

foreach(node in xmlfile)
{
    foreach(key in excelfile)
    {
        if(key.Equals(node))
        {

将执行xmlfile的rowcount * excelfile的rowcount比较。如果你有两个文件,即1 000行,你将进行1 000 * 1 000 = 1 000 000比较操作。

取代这种压倒性的工作,取一个文件并将节点值读入哈希表。然后循环遍历另一个文件并检查是否从哈希表中找到了值。

答案 1 :(得分:0)

这可能不是你的最终解决方案,但它非常简单有效,只需将较大的循环作为外部循环而小循环是内部循环,然后在找到密钥时中断:

foreach(key in excelfile)
{
    foreach(node in xmlfile)
    {
        if(key.Equals(node))
        {
            print node +"found"
            break;
        }
    }
}

这将消除每个xml迭代的整个大excel文件的开销循环(当使用break时,否则没有差异),相反,它将循环遍历每个excel迭代的小xml文件,甚至打破匹配。

答案 2 :(得分:0)

一种选择是从其中一个集合构建交替正则表达式,然后将其与-match运算符一起用于另一个集合:

$collection = 1..10
$even = 2,4,6,8,10

[regex]$even_regex = ‘(?i)^(‘ + (($even |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’

$collection -match $even_regex |
  foreach { "Found $_ "}

Found 2 
Found 4 
Found 6 
Found 8 
Found 10