Skip to content

Conversation

@codeflash-ai
Copy link

@codeflash-ai codeflash-ai bot commented Oct 24, 2025

📄 99% (0.99x) speedup for build_default_pretrains in stanza/resources/default_packages.py

⏱️ Runtime : 232 microseconds 117 microseconds (best of 227 runs)

📝 Explanation and details

The optimization replaces an inefficient explicit loop with Python's built-in dict.update() method.

Key change: The original code iterates through specific_default_pretrains.keys() and assigns each key-value pair individually:

for lang in specific_default_pretrains.keys():
    default_pretrains[lang] = specific_default_pretrains[lang]

The optimized version uses a single dict.update() call:

default_pretrains.update(specific_default_pretrains)

Why this is faster:

  • dict.update() is implemented in C and performs bulk updates efficiently, avoiding Python's per-iteration overhead
  • Eliminates 2,635 individual dictionary assignments (83.7% of total execution time in the original)
  • Reduces from ~2,666 loop iterations with hash lookups to a single optimized C operation

Performance gains are most significant when:

  • specific_default_pretrains contains many entries (like the 85+ language mappings in the test data)
  • The function is called frequently, as the 98% speedup (232μs → 117μs) compounds across multiple calls
  • Large-scale scenarios where dictionary operations dominate runtime, as evidenced by the test cases with hundreds of language mappings

The optimization maintains identical behavior while leveraging Python's optimized built-in methods for dictionary operations.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 🔘 None Found
🌀 Generated Regression Tests 35 Passed
⏪ Replay Tests 2 Passed
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
🌀 Generated Regression Tests and Runtime
import pytest  # used for our unit tests
from stanza.resources.default_packages import build_default_pretrains

# function to test
# (copied verbatim from the provided code block)
default_treebanks = {
    "af":      "afribooms",
    "ang":     "nerthus",
    "ar":      "padt",
    "be":      "hse",
    "bg":      "btb",
    "bxr":     "bdt",
    "ca":      "ancora",
    "cop":     "scriptorium",
    "cs":      "pdt",
    "cu":      "proiel",
    "cy":      "ccg",
    "da":      "ddt",
    "de":      "combined",
    "el":      "gdt",
    "en":      "combined",
    "es":      "combined",
    "et":      "edt",
    "eu":      "bdt",
    "fa":      "perdt",
    "fi":      "tdt",
    "fo":      "farpahc",
    "fr":      "combined",
    "fro":     "profiterole",
    "ga":      "idt",
    "gd":      "arcosg",
    "gl":      "ctg",
    "got":     "proiel",
    "grc":     "perseus",
    "gv":      "cadhan",
    "hbo":     "ptnk",
    "he":      "combined",
    "hi":      "hdtb",
    "hr":      "set",
    "hsb":     "ufal",
    "hu":      "szeged",
    "hy":      "armtdp",
    "hyw":     "armtdp",
    "id":      "gsd",
    "is":      "icepahc",
    "it":      "combined",
    "ja":      "gsd",
    "ka":      "glc",
    "kk":      "ktb",
    "kmr":     "mg",
    "ko":      "kaist",
    "kpv":     "lattice",
    "ky":      "ktmu",
    "la":      "ittb",
    "lij":     "glt",
    "lt":      "alksnis",
    "lv":      "lvtb",
    "lzh":     "kyoto",
    "mr":      "ufal",
    "mt":      "mudt",
    "my":      "ucsy",
    "myv":     "jr",
    "nb":      "bokmaal",
    "nds":     "lsdc",
    "nl":      "alpino",
    "nn":      "nynorsk",
    "olo":     "kkpp",
    "orv":     "torot",
    "ota":     "boun",
    "pcm":     "nsc",
    "pl":      "pdb",
    "pt":      "bosque",
    "qaf":     "arabizi",
    "qpm":     "philotis",
    "qtd":     "sagt",
    "ro":      "rrt",
    "ru":      "syntagrus",
    "sa":      "vedic",
    "sd":      "isra",
    "sk":      "snk",
    "sl":      "ssj",
    "sme":     "giella",
    "sq":      "combined",
    "sr":      "set",
    "sv":      "talbanken",
    "swl":     "sslc",
    "ta":      "ttb",
    "te":      "mtg",
    "th":      "tud",
    "tr":      "imst",
    "ug":      "udt",
    "uk":      "iu",
    "ur":      "udtb",
    "vi":      "vtb",
    "wo":      "wtb",
    "xcl":     "caval",
    "zh-hans": "gsdsimp",
    "zh-hant": "gsd",
    "multilingual": "ud"
}

no_pretrain_languages = set([
    "cop",
    "olo",
    "orv",
    "pcm",
    "qaf",
    "qpm",
    "qtd",
    "swl",
    "multilingual",
])

specific_default_pretrains = {
    "af":      "fasttextwiki",
    "ang":     "nerthus",
    "ar":      "conll17",
    "be":      "fasttextwiki",
    "bg":      "conll17",
    "bxr":     "fasttextwiki",
    "ca":      "conll17",
    "cs":      "conll17",
    "cu":      "conll17",
    "cy":      "fasttext157",
    "da":      "conll17",
    "de":      "conll17",
    "el":      "conll17",
    "en":      "conll17",
    "es":      "conll17",
    "et":      "conll17",
    "eu":      "conll17",
    "fa":      "conll17",
    "fi":      "conll17",
    "fo":      "fasttextwiki",
    "fr":      "conll17",
    "fro":     "conll17",
    "ga":      "conll17",
    "gd":      "fasttextwiki",
    "gl":      "conll17",
    "got":     "fasttextwiki",
    "grc":     "conll17",
    "gv":      "fasttext157",
    "hbo":     "utah",
    "he":      "conll17",
    "hi":      "conll17",
    "hr":      "conll17",
    "hsb":     "fasttextwiki",
    "hu":      "conll17",
    "hy":      "isprasglove",
    "hyw":     "isprasglove",
    "id":      "conll17",
    "is":      "fasttext157",
    "it":      "conll17",
    "ja":      "conll17",
    "ka":      "fasttext157",
    "kk":      "fasttext157",
    "kmr":     "fasttextwiki",
    "ko":      "conll17",
    "kpv":     "fasttextwiki",
    "ky":      "fasttext157",
    "la":      "conll17",
    "lij":     "fasttextwiki",
    "lt":      "fasttextwiki",
    "lv":      "conll17",
    "lzh":     "fasttextwiki",
    "mr":      "fasttextwiki",
    "mt":      "fasttextwiki",
    "my":      "ucsy",
    "myv":     "mokha",
    "nb":      "conll17",
    "nds":     "fasttext157",
    "nl":      "conll17",
    "nn":      "conll17",
    "or":      "fasttext157",
    "ota":     "conll17",
    "pl":      "conll17",
    "pt":      "conll17",
    "ro":      "conll17",
    "ru":      "conll17",
    "sa":      "fasttext157",
    "sd":      "isra",
    "sk":      "conll17",
    "sl":      "conll17",
    "sme":     "fasttextwiki",
    "sq":      "fasttext157",
    "sr":      "fasttextwiki",
    "sv":      "conll17",
    "ta":      "fasttextwiki",
    "te":      "fasttextwiki",
    "th":      "fasttext157",
    "tr":      "conll17",
    "ug":      "conll17",
    "uk":      "conll17",
    "ur":      "conll17",
    "vi":      "conll17",
    "wo":      "fasttextwiki",
    "xcl":     "caval",
    "zh-hans": "fasttext157",
    "zh-hant": "conll17",
}
from stanza.resources.default_packages import build_default_pretrains

codeflash_output = build_default_pretrains(default_treebanks); default_pretrains = codeflash_output

# unit tests

# BASIC TEST CASES

def test_basic_expected_keys_and_values():
    # Test that a known language (en) is present and has the correct value
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_basic_specific_pretrain_override():
    # Test that a language with a specific pretrain (af) is overridden correctly
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_basic_removal_of_no_pretrain_languages():
    # Test that a language in no_pretrain_languages (cop) is removed
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_basic_non_overridden_language():
    # Test a language not in specific_default_pretrains or no_pretrain_languages
    # For example, 'lij' is in specific_default_pretrains, but let's use 'ota' (which is overridden)
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_basic_language_not_in_treebanks():
    # Test a language in specific_default_pretrains but not in default_treebanks
    # For example, 'or' is in specific_default_pretrains but not in default_treebanks
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

# EDGE TEST CASES

def test_edge_empty_treebanks():
    # Test with empty default_treebanks
    codeflash_output = build_default_pretrains({}); result = codeflash_output
    # Should only contain languages from specific_default_pretrains, except those in no_pretrain_languages
    for lang in specific_default_pretrains:
        if lang not in no_pretrain_languages:
            pass
        else:
            pass
    # Should not contain any of the no_pretrain_languages
    for lang in no_pretrain_languages:
        pass

def test_edge_treebanks_with_only_no_pretrain_languages():
    # Test with treebanks containing only languages that should be removed
    only_no_pretrain = {lang: "dummy" for lang in no_pretrain_languages}
    codeflash_output = build_default_pretrains(only_no_pretrain); result = codeflash_output
    # Should only contain specific_default_pretrains not in no_pretrain_languages
    for lang in specific_default_pretrains:
        if lang not in no_pretrain_languages:
            pass
    for lang in no_pretrain_languages:
        pass

def test_edge_treebanks_with_duplicate_keys():
    # Test with duplicate keys in input (shouldn't happen in dict, but test overwriting)
    treebanks = {"en": "oldvalue"}
    codeflash_output = build_default_pretrains(treebanks); result = codeflash_output

def test_edge_language_in_both_no_pretrain_and_specific_pretrains():
    # For example, 'multilingual' is in both no_pretrain_languages and default_treebanks
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_edge_language_in_specific_pretrains_and_no_pretrain_languages():
    # For example, 'cop' is in both specific_default_pretrains and no_pretrain_languages
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_edge_language_in_specific_pretrains_only():
    # For example, 'or' is only in specific_default_pretrains
    codeflash_output = build_default_pretrains({}); result = codeflash_output

def test_edge_language_in_no_pretrain_only():
    # For example, 'pcm' is only in no_pretrain_languages
    codeflash_output = build_default_pretrains({}); result = codeflash_output

def test_edge_language_in_treebanks_and_no_pretrain_languages():
    # For example, 'olo' is in both default_treebanks and no_pretrain_languages
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_edge_language_in_treebanks_and_specific_pretrains_and_no_pretrain_languages():
    # For example, 'cop' is in all three
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_edge_none_input():
    # Test with None as input; should raise TypeError
    with pytest.raises(TypeError):
        build_default_pretrains(None)


def test_edge_treebanks_with_non_string_keys_and_values():
    # Test with non-string keys/values
    treebanks = {1: 2, 3: 4}
    codeflash_output = build_default_pretrains(treebanks); result = codeflash_output
    # Only specific_default_pretrains keys should be present
    for lang in specific_default_pretrains:
        if lang not in no_pretrain_languages:
            pass
    # Non-string keys should remain if not removed
    for k in treebanks:
        if k not in no_pretrain_languages and k not in specific_default_pretrains:
            pass

# LARGE SCALE TEST CASES

def test_large_scale_many_languages():
    # Create a large number of languages
    large_treebanks = {f"lang{i}": f"tb{i}" for i in range(1000)}
    # Add some of the no_pretrain_languages and specific_default_pretrains
    large_treebanks.update({lang: "tb" for lang in no_pretrain_languages})
    codeflash_output = build_default_pretrains(large_treebanks); result = codeflash_output
    # None of the no_pretrain_languages should be present
    for lang in no_pretrain_languages:
        pass
    # All specific_default_pretrains should be present (unless in no_pretrain_languages)
    for lang in specific_default_pretrains:
        if lang not in no_pretrain_languages:
            pass
    # All the other languages should be present
    for i in range(1000):
        lang = f"lang{i}"

def test_large_scale_specific_pretrain_overrides():
    # Create treebanks with overlapping keys with specific_default_pretrains
    treebanks = {lang: "dummy" for lang in specific_default_pretrains}
    codeflash_output = build_default_pretrains(treebanks); result = codeflash_output
    # All should be overridden to specific_default_pretrains value
    for lang in specific_default_pretrains:
        if lang not in no_pretrain_languages:
            pass
        else:
            pass

def test_large_scale_no_pretrain_removal():
    # Create treebanks with 1000 languages, half of which are in no_pretrain_languages
    treebanks = {f"lang{i}": f"tb{i}" for i in range(500)}
    treebanks.update({lang: "tb" for lang in list(no_pretrain_languages)[:500]})
    codeflash_output = build_default_pretrains(treebanks); result = codeflash_output
    # None of the no_pretrain_languages should be present
    for lang in no_pretrain_languages:
        pass

def test_large_scale_empty_specific_default_pretrains():
    # Temporarily empty specific_default_pretrains
    orig_specific = dict(specific_default_pretrains)
    try:
        specific_default_pretrains.clear()
        treebanks = {f"lang{i}": f"tb{i}" for i in range(100)}
        codeflash_output = build_default_pretrains(treebanks); result = codeflash_output
        # All treebanks except those in no_pretrain_languages should be present
        for i in range(100):
            lang = f"lang{i}"
    finally:
        specific_default_pretrains.update(orig_specific)

def test_large_scale_empty_no_pretrain_languages():
    # Temporarily empty no_pretrain_languages
    orig_no_pretrain = set(no_pretrain_languages)
    try:
        no_pretrain_languages.clear()
        treebanks = {f"lang{i}": f"tb{i}" for i in range(100)}
        codeflash_output = build_default_pretrains(treebanks); result = codeflash_output
        # All treebanks and specific_default_pretrains should be present
        for i in range(100):
            lang = f"lang{i}"
        for lang in specific_default_pretrains:
            pass
    finally:
        no_pretrain_languages.update(orig_no_pretrain)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
import pytest
from stanza.resources.default_packages import build_default_pretrains

# function to test
# Copied from the prompt, with all referenced data structures
default_treebanks = {
    "af":      "afribooms",
    "ang":     "nerthus",
    "ar":      "padt",
    "be":      "hse",
    "bg":      "btb",
    "bxr":     "bdt",
    "ca":      "ancora",
    "cop":     "scriptorium",
    "cs":      "pdt",
    "cu":      "proiel",
    "cy":      "ccg",
    "da":      "ddt",
    "de":      "combined",
    "el":      "gdt",
    "en":      "combined",
    "es":      "combined",
    "et":      "edt",
    "eu":      "bdt",
    "fa":      "perdt",
    "fi":      "tdt",
    "fo":      "farpahc",
    "fr":      "combined",
    "fro":     "profiterole",
    "ga":      "idt",
    "gd":      "arcosg",
    "gl":      "ctg",
    "got":     "proiel",
    "grc":     "perseus",
    "gv":      "cadhan",
    "hbo":     "ptnk",
    "he":      "combined",
    "hi":      "hdtb",
    "hr":      "set",
    "hsb":     "ufal",
    "hu":      "szeged",
    "hy":      "armtdp",
    "hyw":     "armtdp",
    "id":      "gsd",
    "is":      "icepahc",
    "it":      "combined",
    "ja":      "gsd",
    "ka":      "glc",
    "kk":      "ktb",
    "kmr":     "mg",
    "ko":      "kaist",
    "kpv":     "lattice",
    "ky":      "ktmu",
    "la":      "ittb",
    "lij":     "glt",
    "lt":      "alksnis",
    "lv":      "lvtb",
    "lzh":     "kyoto",
    "mr":      "ufal",
    "mt":      "mudt",
    "my":      "ucsy",
    "myv":     "jr",
    "nb":      "bokmaal",
    "nds":     "lsdc",
    "nl":      "alpino",
    "nn":      "nynorsk",
    "olo":     "kkpp",
    "orv":     "torot",
    "ota":     "boun",
    "pcm":     "nsc",
    "pl":      "pdb",
    "pt":      "bosque",
    "qaf":     "arabizi",
    "qpm":     "philotis",
    "qtd":     "sagt",
    "ro":      "rrt",
    "ru":      "syntagrus",
    "sa":      "vedic",
    "sd":      "isra",
    "sk":      "snk",
    "sl":      "ssj",
    "sme":     "giella",
    "sq":      "combined",
    "sr":      "set",
    "sv":      "talbanken",
    "swl":     "sslc",
    "ta":      "ttb",
    "te":      "mtg",
    "th":      "tud",
    "tr":      "imst",
    "ug":      "udt",
    "uk":      "iu",
    "ur":      "udtb",
    "vi":      "vtb",
    "wo":      "wtb",
    "xcl":     "caval",
    "zh-hans": "gsdsimp",
    "zh-hant": "gsd",
    "multilingual": "ud"
}

no_pretrain_languages = set([
    "cop",
    "olo",
    "orv",
    "pcm",
    "qaf",
    "qpm",
    "qtd",
    "swl",
    "multilingual",
])

specific_default_pretrains = {
    "af":      "fasttextwiki",
    "ang":     "nerthus",
    "ar":      "conll17",
    "be":      "fasttextwiki",
    "bg":      "conll17",
    "bxr":     "fasttextwiki",
    "ca":      "conll17",
    "cs":      "conll17",
    "cu":      "conll17",
    "cy":      "fasttext157",
    "da":      "conll17",
    "de":      "conll17",
    "el":      "conll17",
    "en":      "conll17",
    "es":      "conll17",
    "et":      "conll17",
    "eu":      "conll17",
    "fa":      "conll17",
    "fi":      "conll17",
    "fo":      "fasttextwiki",
    "fr":      "conll17",
    "fro":     "conll17",
    "ga":      "conll17",
    "gd":      "fasttextwiki",
    "gl":      "conll17",
    "got":     "fasttextwiki",
    "grc":     "conll17",
    "gv":      "fasttext157",
    "hbo":     "utah",
    "he":      "conll17",
    "hi":      "conll17",
    "hr":      "conll17",
    "hsb":     "fasttextwiki",
    "hu":      "conll17",
    "hy":      "isprasglove",
    "hyw":     "isprasglove",
    "id":      "conll17",
    "is":      "fasttext157",
    "it":      "conll17",
    "ja":      "conll17",
    "ka":      "fasttext157",
    "kk":      "fasttext157",
    "kmr":     "fasttextwiki",
    "ko":      "conll17",
    "kpv":     "fasttextwiki",
    "ky":      "fasttext157",
    "la":      "conll17",
    "lij":     "fasttextwiki",
    "lt":      "fasttextwiki",
    "lv":      "conll17",
    "lzh":     "fasttextwiki",
    "mr":      "fasttextwiki",
    "mt":      "fasttextwiki",
    "my":      "ucsy",
    "myv":     "mokha",
    "nb":      "conll17",
    "nds":     "fasttext157",
    "nl":      "conll17",
    "nn":      "conll17",
    "or":      "fasttext157",
    "ota":     "conll17",
    "pl":      "conll17",
    "pt":      "conll17",
    "ro":      "conll17",
    "ru":      "conll17",
    "sa":      "fasttext157",
    "sd":      "isra",
    "sk":      "conll17",
    "sl":      "conll17",
    "sme":     "fasttextwiki",
    "sq":      "fasttext157",
    "sr":      "fasttextwiki",
    "sv":      "conll17",
    "ta":      "fasttextwiki",
    "te":      "fasttextwiki",
    "th":      "fasttext157",
    "tr":      "conll17",
    "ug":      "conll17",
    "uk":      "conll17",
    "ur":      "conll17",
    "vi":      "conll17",
    "wo":      "fasttextwiki",
    "xcl":     "caval",
    "zh-hans": "fasttext157",
    "zh-hant": "conll17",
}
from stanza.resources.default_packages import build_default_pretrains

# unit tests

# 1. BASIC TEST CASES

def test_basic_inclusion_and_exclusion():
    # Test that languages in no_pretrain_languages are excluded
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output
    for lang in no_pretrain_languages:
        pass

def test_specific_pretrain_override():
    # Test that the override works for a language in both default_treebanks and specific_default_pretrains
    codeflash_output = build_default_pretrains(default_treebanks); result = codeflash_output

def test_language_only_in_treebanks():
    # Add a language only in default_treebanks, not in specific_default_pretrains or no_pretrain_languages
    custom_treebanks = dict(default_treebanks)
    custom_treebanks["zz"] = "zzbank"
    codeflash_output = build_default_pretrains(custom_treebanks); result = codeflash_output

def test_language_only_in_specific_default_pretrains():
    # Add a language only in specific_default_pretrains, not in default_treebanks
    custom_specific = dict(specific_default_pretrains)
    custom_specific["yy"] = "yyemb"
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in no_pretrain_languages:
            default_pretrains.pop(lang, None)
        for lang in custom_specific.keys():
            default_pretrains[lang] = custom_specific[lang]
        return default_pretrains
    result = build_default_pretrains_custom(default_treebanks)

def test_language_in_all_three():
    # Add a language in all three: default_treebanks, specific_default_pretrains, and no_pretrain_languages
    custom_treebanks = dict(default_treebanks)
    custom_treebanks["xx"] = "xxtree"
    custom_specific = dict(specific_default_pretrains)
    custom_specific["xx"] = "xxemb"
    custom_no_pretrain = set(no_pretrain_languages)
    custom_no_pretrain.add("xx")
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in custom_no_pretrain:
            default_pretrains.pop(lang, None)
        for lang in custom_specific.keys():
            default_pretrains[lang] = custom_specific[lang]
        return default_pretrains
    result = build_default_pretrains_custom(custom_treebanks)

# 2. EDGE TEST CASES

def test_empty_treebanks():
    # If default_treebanks is empty, only languages from specific_default_pretrains should be present
    codeflash_output = build_default_pretrains({}); result = codeflash_output
    # All keys in result should be from specific_default_pretrains
    for lang in result:
        pass
    # No language from no_pretrain_languages should be present
    for lang in no_pretrain_languages:
        pass

def test_empty_specific_default_pretrains():
    # If specific_default_pretrains is empty, only default_treebanks minus no_pretrain_languages should be present
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in no_pretrain_languages:
            default_pretrains.pop(lang, None)
        # No override
        return default_pretrains
    result = build_default_pretrains_custom(default_treebanks)
    for lang in result:
        pass

def test_all_languages_in_no_pretrain():
    # If all languages are in no_pretrain_languages, only specific_default_pretrains should be present
    custom_treebanks = {k: "tb" for k in ["a", "b", "c"]}
    custom_no_pretrain = set(custom_treebanks.keys())
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in custom_no_pretrain:
            default_pretrains.pop(lang, None)
        for lang in specific_default_pretrains.keys():
            default_pretrains[lang] = specific_default_pretrains[lang]
        return default_pretrains
    result = build_default_pretrains_custom(custom_treebanks)
    # None of "a", "b", "c" should be present
    for lang in custom_treebanks:
        pass
    # All specific_default_pretrains should be present
    for lang in specific_default_pretrains:
        pass

def test_overlapping_keys():
    # Test that a language in both default_treebanks and specific_default_pretrains gets the override
    custom_treebanks = dict(default_treebanks)
    custom_treebanks["en"] = "mytreebank"
    codeflash_output = build_default_pretrains(custom_treebanks); result = codeflash_output

def test_non_string_keys_and_values():
    # Test with integer keys and values
    custom_treebanks = {1: 10, 2: 20}
    custom_specific = {2: 200, 3: 300}
    custom_no_pretrain = {1}
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in custom_no_pretrain:
            default_pretrains.pop(lang, None)
        for lang in custom_specific.keys():
            default_pretrains[lang] = custom_specific[lang]
        return default_pretrains
    result = build_default_pretrains_custom(custom_treebanks)

def test_mutation_safety():
    # Ensure function does not mutate input dict
    custom_treebanks = dict(default_treebanks)
    original = dict(custom_treebanks)
    build_default_pretrains(custom_treebanks)

# 3. LARGE SCALE TEST CASES

def test_large_scale_treebanks_and_pretrains():
    # Create a large number of fake languages
    N = 900
    treebanks = {f"lang{i}": f"treebank{i}" for i in range(N)}
    # Add some to no_pretrain_languages
    no_pretrain = set(f"lang{i}" for i in range(0, N, 10))
    # Add some specific overrides
    specifics = {f"lang{i}": f"emb{i}" for i in range(0, N, 5)}
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in no_pretrain:
            default_pretrains.pop(lang, None)
        for lang in specifics.keys():
            default_pretrains[lang] = specifics[lang]
        return default_pretrains
    result = build_default_pretrains_custom(treebanks)
    # All languages in no_pretrain should not be present
    for lang in no_pretrain:
        pass
    # All languages in specifics should be present and have override value
    for lang in specifics:
        pass
    # All other languages should have treebank value
    for i in range(N):
        lang = f"lang{i}"
        if lang in no_pretrain:
            continue
        if lang in specifics:
            continue

def test_large_scale_only_specific_default_pretrains():
    # Large number of specific_default_pretrains, empty treebanks
    N = 900
    specifics = {f"lang{i}": f"emb{i}" for i in range(N)}
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in set():
            default_pretrains.pop(lang, None)
        for lang in specifics.keys():
            default_pretrains[lang] = specifics[lang]
        return default_pretrains
    result = build_default_pretrains_custom({})
    for i in range(N):
        lang = f"lang{i}"

def test_large_scale_no_pretrain_languages():
    # Large number of no_pretrain_languages
    N = 900
    treebanks = {f"lang{i}": f"treebank{i}" for i in range(N)}
    no_pretrain = set(treebanks.keys())
    specifics = {}
    def build_default_pretrains_custom(default_treebanks):
        default_pretrains = dict(default_treebanks)
        for lang in no_pretrain:
            default_pretrains.pop(lang, None)
        for lang in specifics.keys():
            default_pretrains[lang] = specifics[lang]
        return default_pretrains
    result = build_default_pretrains_custom(treebanks)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
⏪ Replay Tests and Runtime

To edit these changes git checkout codeflash/optimize-build_default_pretrains-mh4h84oo and push.

Codeflash

The optimization replaces an inefficient explicit loop with Python's built-in `dict.update()` method. 

**Key change:** The original code iterates through `specific_default_pretrains.keys()` and assigns each key-value pair individually:
```python
for lang in specific_default_pretrains.keys():
    default_pretrains[lang] = specific_default_pretrains[lang]
```

The optimized version uses a single `dict.update()` call:
```python
default_pretrains.update(specific_default_pretrains)
```

**Why this is faster:** 
- `dict.update()` is implemented in C and performs bulk updates efficiently, avoiding Python's per-iteration overhead
- Eliminates 2,635 individual dictionary assignments (83.7% of total execution time in the original)
- Reduces from ~2,666 loop iterations with hash lookups to a single optimized C operation

**Performance gains are most significant when:**
- `specific_default_pretrains` contains many entries (like the 85+ language mappings in the test data)  
- The function is called frequently, as the 98% speedup (232μs → 117μs) compounds across multiple calls
- Large-scale scenarios where dictionary operations dominate runtime, as evidenced by the test cases with hundreds of language mappings

The optimization maintains identical behavior while leveraging Python's optimized built-in methods for dictionary operations.
@codeflash-ai codeflash-ai bot requested a review from mashraf-222 October 24, 2025 06:35
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Oct 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants