Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,如何在不复制循环的情况下将if语句移到for循环之外_Python_Loops_Optimization - Fatal编程技术网

Python,如何在不复制循环的情况下将if语句移到for循环之外

Python,如何在不复制循环的情况下将if语句移到for循环之外,python,loops,optimization,Python,Loops,Optimization,我可以用两种方法编写函数 def output_ip_hist(target, final, stats, table_name, bulk_qty, type = "sql"): if(type == "sql"): field_names = ",".join(get_field_names(final, table_name)) count = 0 stats[table_name] = 0 values = []

我可以用两种方法编写函数

def output_ip_hist(target, final, stats, table_name, bulk_qty, type = "sql"):
    if(type == "sql"):
        field_names = ",".join(get_field_names(final, table_name))
        count = 0
        stats[table_name] = 0
        values = []
        for comp_name, row in final.items():
            for ip_address, sub_row in row.items():
                for index, ip_hist in enumerate(sub_row):
                    hist_item = ip_hist.replace('"', "'")
                    values.append('("' + comp_name + '", "' + ip_address + '", ' + str(index) + ',"' + hist_item + '")')
                    count += 1
                    if(count == bulk_qty):
                        insert_sql_many(target, count, table_name, field_names, values, stats)
                        count = 0
                        values = []
        if(count != 0):
            insert_sql_many(target, count, table_name, field_names, values, stats)
    elif(type == "csv"):
        for comp_name, row in final.items():
            for ip_address, sub_row in row.items():
                for index, ip_hist in enumerate(sub_row):
                    insert_csv(target, { "computer_name": comp_name, "id": str(index), "ip_address": ip_address, "hist_item": ip_hist.replace('"', "'") }, stats, table_name)
这是第一条路。这种方法的缺点是循环被写入两次,从而产生一些重复

第二种方法是将最外层的if语句移动到循环中,这样循环只完成一次,但这样做的缺点是if语句会在每个循环上执行,从而减慢了循环速度,循环可能会通过400万条记录

我想知道是否有可能做到两全其美,减少重复并尽可能快地保持循环


谢谢

您可以定义两个函数:
process\u sql
process\u csv
。根据
数据类型
,您可以将
处理数据
设置为第一个功能或第二个功能

在循环内部,您可以使用
处理数据

def process_sql(a,b):
    print "SQL"
    return a-b

def process_csv(a,b):
    print "CSV"
    return a+b

data_type = "CSV"

if data_type == "CSV":
    process_data = process_csv
else:
    process_data = process_sql

for a in range(3):
    for b in range(3):
        print process_data(a,b)
#   CSV 
#   0
#   CSV
#   1
#   CSV
#   2
#   CSV
#   1
#   CSV
#   2
#   CSV
#   3
#   CSV
#   2
#   CSV
#   3
#   CSV
#   4

您可以尝试编写生成器,从嵌套循环生成值流。这还允许您使用
itertools.islice
简化SQL批处理代码

def my_generator(final):
    for comp_name, row in final.items():
        for ip_address, sub_row in row.items():
            for index, ip_hist in enumerate(sub_row):
               yield comp_name, ip_address, index, ip_hist.replace('"', "'")

def output_ip_hist(target, final, stats, table_name, bulk_qty, type = "sql"):
    items = my_generator(final)
    if type == "sql":
        field_names = ",".join(get_field_names(final, table_name))
        stats[table_name] = 0
        while True:
            values = ['("%s", "%s", "%s", "%s")' % i for i in islice(items, bulk_qty)]
            if not values:
                break                
            insert_sql_many(target, len(values), table_name, field_names, values, stats)
    elif type == "csv":
        for comp_name, ip_address, index, hist_item in items:
            blob = {
                "computer_name": comp_name,
                "id": str(index),
                "ip_address": ip_address,
                "hist_item": hist_item
            }
            insert_csv(target, blob, stats, table_name)
不过,将两个不同的函数合并成一个函数,封装一个
if
station,这有点像是一种反模式

def output_ip_hist_sql(target, final, stats, table_name, bulk_qty):
    field_names = ",".join(get_field_names(final, table_name))
    stats[table_name] = 0

    items = my_generator(final)
    while True:
        values = ['("%s", "%s", "%s", "%s")' % i for i in islice(items, bulk_qty)]
        if not values:
            break                
        insert_sql_many(target, len(values), table_name, field_names, values, stats)

def output_ip_hist_csv(target, final, stats, table_name):
    items = my_generator(final)
    for comp_name, ip_address, index, hist_item in items:
        blob = {
            "computer_name": comp_name,
            "id": str(index),
            "ip_address": ip_address,
            "hist_item": hist_item
        }
        insert_csv(target, blob, stats, table_name)