递归结果存储优化:替代文件读写返回排列结果方案咨询
Hey Thomas, that file-writing workaround is definitely a clunky, slow approach—let's get you a clean, fast solution that returns permutations directly as a list without touching the disk.
The Core Problem with Your Current Method
Writing permutations to a file then reading them back is a huge waste of resources: disk I/O is orders of magnitude slower than in-memory operations, plus you're adding extra code to handle file open/close/read logic that's totally unnecessary.
Solution 1: Modify Your Custom Permutation Function to Collect Results
If you're rolling your own permutation algorithm (like a recursive backtracking one), instead of printing each permutation, add it directly to a list. Here's how to adjust a typical recursive implementation:
Before (Printing Version)
def permute(arr, l, r): if l == r: print(''.join(arr)) else: for i in range(l, r+1): arr[l], arr[i] = arr[i], arr[l] permute(arr, l+1, r) arr[l], arr[i] = arr[i], arr[l] # Backtrack
After (List Collection Version)
def permute(arr, l, r, result=None): # Initialize the result list on first call if result is None: result = [] if l == r: # Add a COPY of the current permutation (since lists are mutable) result.append(''.join(arr)) else: for i in range(l, r+1): arr[l], arr[i] = arr[i], arr[l] permute(arr, l+1, r, result) arr[l], arr[i] = arr[i], arr[l] # Backtrack return result # Usage example my_items = ["a", "b", "c"] all_permutations = permute(my_items, 0, len(my_items)-1) print(all_permutations) # Output: ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
Key note: We use ''.join(arr) to create an immutable string of the permutation—this avoids issues with the original list being modified during backtracking. If you need the permutations as lists instead of strings, append arr.copy() instead.
Solution 2: Use Python's Built-in itertools.permutations (Even Easier!)
If you don't need to implement permutations from scratch, Python's standard library has an optimized itertools.permutations function that returns an iterator. Just convert it to a list directly:
import itertools def get_permutations(items): # Convert the iterator to a list of strings (or keep as tuples if preferred) return [''.join(perm) for perm in itertools.permutations(items)] # Usage example all_perms = get_permutations(["a", "b", "c"]) print(all_perms) # Same output as above
This approach is not only cleaner but also faster than most custom implementations, since itertools is written in C under the hood.
Why This Is Way Better
- Speed: In-memory collection eliminates disk I/O overhead, so you'll see that 3x+ speed improvement you were missing.
- Cleaner Code: No more file handling boilerplate—just focus on generating permutations.
- Less Error-Prone: No risk of file permission issues, corrupted files, or parsing mistakes when reading back from disk.
内容的提问来源于stack exchange,提问作者Thomas

